NodeJS 解释'DEBUG=myapp:* npm start'实际上在做什么

9w11ddsr  于 2023-04-05  发布在  Node.js
关注(0)|答案(8)|浏览(181)

Express应用程序生成器的入门页面(位于here)说明,如果使用MacOS或Linux,则使用$ DEBUG=myapp:* npm start启动服务器。
这很好用,但我不太明白这行代码到底在做什么。我本以为它会给变量DEBUG赋值,但在退出服务器后,我运行了echo $DEBUG,它什么也没打印出来。我猜:在这里是关键,但我不清楚为什么。
希望有人能为我打破这个。

zsohkypk

zsohkypk1#

  • DEBUG=myapp:* npm start由两部分组成。

  • 第一部分为DEBUG=myapp:*,第二部分为npm start

  • 您可以先在命令行工具中运行DEBUG=myapp:*,然后再运行npm start

  • DEBUG=myapp:*意味着你告诉nodejs你想打开日志记录以进行调试。

  • 记住用你的应用名称替换myapp。你可以在package.json文件中的"name"属性下找到你的应用名称。

  • myapp:*中的*表示查看Express中使用的所有内部日志

  • 如果您只想查看路由器实现的日志,则将DEBUG的值设置为myapp:router。同样,要仅查看应用程序实现的日志,则将DEBUG的值设置为myapp:application,依此类推。

  • npm start告诉npm运行package.json文件中声明的scripts,脚本名为start

  • Source: https://expressjs.com/en/guide/debugging.html

uujelgoq

uujelgoq2#

DEBUG被设置为npm和子进程的环境变量,但没有在shell中设置,请考虑以下情况:

HELLO=World bash -c 'echo $HELLO' # World
HELLO=World bash -c "bash -c 'echo \$HELLO'" # World
echo $HELLO # Nothing, assuming that HELLO was null before running the above snippets

在你的例子中,值myapp:*被赋值给变量DEBUG。这个变量将在npm中可用,我不能回答为什么需要它。

niknxzdl

niknxzdl3#

事实证明,我认为这比实际情况要复杂得多。切普纳的回答让我的头脑中有些问题得到了解决。
我创建了一个打印DEBUG变量的python脚本,并调用了它而不是npm start
$ DEBUG=myapp:* python printvar.py
果然,这打印了myapp:*。似乎我遗漏的一个重要部分是变量赋值后的空格用作命令和:*之间的分隔符,它只不过是赋值给DEBUG的变量的一部分。

e4eetjau

e4eetjau4#

DEBUG是一个环境变量,通过通配符 * 设置为myapp应用程序中的所有调试器,用于会话持续时间。DEBUG变量由“tiny node.js & browser debugging utility for your libraries and applications”使用,其文档可以在这里找到。

vshtjzan

vshtjzan5#

这是一项临时任务;npm在其环境中看到分配的值,但它不会影响当前shell。DEBUGnpm退出后保留其所有值(或保持未设置)。

66bbxpm5

66bbxpm56#

:只是赋给env变量的文本。
这条线是做什么的,它是如何工作的,如下所示:
首先,我将讨论express内部级别的调试消息。

DEBUG=express:*, npm start
DEBUG=express.*, npm start
DEBUG=express*, npm start

下面的设置只显示内部路由器的内部日志级别消息

DEBUG=express:router, npm start
DEBUG=express.router, npm start

现在为了查看“应用程序”级别的DEBUG语句。这些语句是你用调试功能添加到代码中的。
它与你的模块依赖关系有关。传入调试包的值。值可以是任何任意名称-也就是说,它们不需要匹配package.json,文件,对象变量名称等。但是env变量DEBUG值需要与你的代码中传入调试包的值相对应。
这行代码

var debug = require('debug') ('myapp:myapp');

考虑这两个文件

www
…
var debug = require('debug')('myapp:www');

app.js
…
var debug = require('debug')('myapp:app');

然后,如果我们运行以下场景:

  1. DEBUG=myapp:* npm start
  2. DEBUG=myapp:www npm start
  3. DEBUG=myapp:app npm start
    我们得到以下结果:
    screen shot
vagrant@n1:~/despobaldo/server$ DEBUG=myapp:* npm start

> server@0.0.0 start /home/vagrant/despobaldo/server
> node ./bin/www

  myapp:app here I am +0ms
  myapp:www Listening on port 3000 +8ms
^Cvagrant@n1:~/despobaldo/server$
vagrant@n1:~/despobaldo/server$
vagrant@n1:~/despobaldo/server$ DEBUG=myapp:www npm start

> server@0.0.0 start /home/vagrant/despobaldo/server
> node ./bin/www

  myapp:www Listening on port 3000 +0ms
^Cvagrant@n1:~/despobaldo/server$
vagrant@n1:~/despobaldo/server$
vagrant@n1:~/despobaldo/server$ DEBUG=myapp:app npm start

> server@0.0.0 start /home/vagrant/despobaldo/server
> node ./bin/www

  myapp:app here I am +0ms
^Cvagrant@n1:~/despobaldo/server$
vagrant@n1:~/despobaldo/server$
vagrant@n1:~/despobaldo/server$

为了查看内部和“应用程序”级别的日志记录,您可以执行以下操作:
DEBUG=myapp:*,express:router npm start
screen shot

vagrant@n1:~/despobaldo/server$
vagrant@n1:~/despobaldo/server$ DEBUG=myapp:*,express:router npm start

> server@0.0.0 start /home/vagrant/despobaldo/server
> node ./bin/www

  express:router use '/' query +0ms
  express:router use '/' expressInit +4ms
  express:router use '/' logger +0ms
  express:router use '/' jsonParser +7ms
  express:router use '/' urlencodedParser +3ms
  express:router use '/' cookieParser +0ms
  express:router use '/' serveStatic +1ms
  myapp:app here I am +0ms
  express:router use '/' router +1ms
  express:router use '/users' router +0ms
  express:router use '/' <anonymous> +0ms
  express:router use '/' <anonymous> +0ms
  myapp:www Listening on port 3000 +7ms
^Cvagrant@n1:~/despobaldo/server$
sdnqo3pr

sdnqo3pr7#

DEBUG=myapp:* npm start
手段
1.设置一个环境变量DEUBG等于“myapp:*"。你可以通过以下方式测试它:

a=b && echo $a 
or
e=f; echo $e

结果是B
1.运行npm start这样一个环境变量。你也可以通过以下方式测试它:

ab=cd node

接入节点终端并输入

process.env

你将看到process.env中的所有变量
同样,您可以设置不同的端口

PORT=4000 npm start

服务器将侦听4000(如果您有这样的块)

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
gc0ot86w

gc0ot86w8#

它不仅限于Express,更广泛地说,它确实是一个名为debug的流行NPM包的工作方式,它也在Express内部使用。在后台,debug包期望DEBUG环境变量来确定 * 要打印的调试消息 *(可以在控制台上,或到文件中,或到stdout中由日志聚合器服务收集)。
特别是在Express的情况下,为了查看其中使用的所有内部日志,我们在启动应用程序时将could环境变量设置为DEBUG。例如,在Linux上,运行:

DEBUG=express:* node index.js

或者,要仅从应用程序实现中查看日志,请运行:

DEBUG=express:application node index.js

以上两个命令(FOO=bar command)中使用的语法是一般的Linux-y方式,用于定义一个一次性的环境变量,该变量只对一个命令的单次执行是独占的,也就是说,只对command是可访问的,并且只在那一次。这是非常有益的,因为它不会不必要地污染环境变量的全局空间。
debug类似于console.log的增强版本,但与console.log不同,我们不必在生产代码中注解掉debug日志。相反,日志记录默认关闭,可以通过使用DEBUG环境变量有条件地打开。
您还可以指定多个调试命名空间(无论是关于Express,还是关于任何其他模块,通过分配逗号分隔的名称列表:

DEBUG=http,mail,express:* node index.js

如果你想知道什么是“namespace”,它同样与debug包有关,例如,考虑这个片段:

const debug = require('debug');
const httpServerLog = debug('http:server');

什么是'http:server'?它只是特定日志的标志/命名空间,您将传递给DEBUG环境变量以打开调试。所以现在您可以这样做:

const http = require('http');
http.createServer((req, res) => {
  httpServerLog(req.method + ' ' + req.url);
  res.end('debug example');
}).listen(3200, () => {
  httpServerLog('listening');
});

要启用上述日志,必须启用“http:server”命名空间,因此我们将执行以下操作:

DEBUG=http:server node app.js

你可以检查任何第三方包的package.json,看看他们是否使用了debug模块,如果他们使用了,你可以检查他们定义的命名空间,并使用相同的方法(传递DEBUG环境变量来传递所需的命名空间)来查看他们的日志。
阅读更多关于“debug”软件包herehere的信息。

相关问题