【问题标题】:node.js: Why does NODE_DEBUG=1 not work? (trying to debug a require() error)node.js:为什么 NODE_DEBUG=1 不起作用? (尝试调试 require() 错误)
【发布时间】:2011-05-09 17:19:29
【问题描述】:

我有一个这样的目录结构:

project
  lib
    paperboy
    redis-client
    node-cookie
  srv
    main.js
  ...

我从项目目录启动main.js:

$ node srv/main.js

在 main.js 中,我可以这样做:

  paperboy = require('./lib/paperboy');

但是,这失败了:

  redis = require('./lib/redis-client');

类似地,如果我在“项目”目录中启动交互节点,我可以要求 paperboy,但不能要求 redis-client。我得到的错误是:

> require('./lib/redis-client')
Error: Cannot find module './lib/redis-client'
    at resolveModuleFilename (node.js:265:13)
    at loadModule (node.js:231:20)
    at require (node.js:291:14)
...

查看resolveModuleFilename() 的源代码,它尝试打印一个我看不到的调试字符串:

debug("looking for " + JSON.stringify(id) + " in " + JSON.stringify(paths));

我已尝试通过 export NODE_DEBUG=1 启用此功能,但在尝试要求时我仍然看不到此调试打印。

在尝试打印此调试时我做错了什么? 其次,为什么paperboy加载正常,但是找不到redis-client?

附加信息:这是“lib”目录中的完整文件/目录列表:

lib
lib/cookie-node
lib/cookie-node/package.json
lib/cookie-node/LICENSE.txt
lib/cookie-node/README.markdown
lib/cookie-node/example
lib/cookie-node/example/ex1.js
lib/cookie-node/index.js
lib/redis-client
lib/redis-client/package.json
lib/redis-client/TODO.md
lib/redis-client/examples
lib/redis-client/examples/redis-version.js
lib/redis-client/examples/using-kiwi.js
lib/redis-client/examples/subscriber.js
lib/redis-client/examples/publisher.js
lib/redis-client/examples/.redis-version.js.swp
lib/redis-client/examples/README.md
lib/redis-client/seed.yml
lib/redis-client/LICENSE
lib/redis-client/test
lib/redis-client/test/test_throw_from_callback.js
lib/redis-client/test/test_shutdown_reconnect.js
lib/redis-client/test/test.js
lib/redis-client/test/sample.png
lib/redis-client/.gitignore
lib/redis-client/lib
lib/redis-client/lib/redis-client.js
lib/redis-client/README.md
lib/paperboy
lib/paperboy/package.json
lib/paperboy/seed.yml
lib/paperboy/LICENSE.txt
lib/paperboy/example
lib/paperboy/example/basic.js
lib/paperboy/example/webroot
lib/paperboy/example/webroot/img
lib/paperboy/example/webroot/img/paperboy.jpg
lib/paperboy/example/webroot/index.html
lib/paperboy/index.js
lib/paperboy/lib
lib/paperboy/lib/paperboy.js
lib/paperboy/README.md

lib 目录是从 github 解压的 .tar.gz 文件,重新命名以匹配 package.json 文件中的模块名称。

【问题讨论】:

    标签: node.js require redis v8


    【解决方案1】:

    你想导出NODE_DEBUG=module,而不是=1

    【讨论】:

      【解决方案2】:
      1. Node.js 查找相对于脚本位置的所需文件,因此您应该使用

        paperboy = require('../lib/paperboy');

        在 srv/mail.js 中。

      2. 据我所知,您必须使用 --debug 选项配置 node.js,然后使其使用任何调试功能。

      【讨论】:

        【解决方案3】:

        这不起作用的原因是,如果 Node.js 的名称为 index.js,它会自动包含一个脚本

        Node Cookie 和 Paperboy 如下所示:

        lib/cookie-node/index.js
        lib/paperboy/index.js
        

        Redis 客户端如下所示:

        lib/redis-client/lib/redis-client.js
        

        您需要将您的要求更改为:

        var redis = require('./lib/redis-client/lib/redis-client');
        

        本质上,node 会像这样查找需要的文件:

        var redis = require('./lib/redis-client');
        
           ./lib/redis-client.js
           ./lib/redis-client/index.js // (if redis-client is a directory).
        

        由于没有index.js文件,node无法继续在./lib/redis-client/的lib目录中查找,不会包含该文件,因为它不知道它叫什么或在哪里它应该位于。

        【讨论】:

        • 这是对常见 JavaScript 模块系统的一个很好的描述。但它并没有回答实际的问题:为什么 NODE_DEBUG 不能像记录的那样工作?
        • 我认为 Sannis 关于为什么 NODE_DEBUG 不起作用的答案是正确的,但觉得他没有完全回答问题的实际内容。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-21
        • 2018-01-12
        • 2013-03-10
        • 2021-04-12
        • 2014-02-05
        • 2017-04-10
        相关资源
        最近更新 更多