Node.js node_modules 相互干扰

Posted

技术标签:

【中文标题】Node.js node_modules 相互干扰【英文标题】:Node.js node_modules interfering with each other 【发布时间】:2013-05-27 14:12:39 【问题描述】:

我对 Node.js 有一个奇怪的问题,其中 node_module 目录似乎相互干扰。我有以下文件结构:

- node_modules
- User.js
- app
  - app.js
  - node_modules

所以我在***目录中有一个 node_modules 以及 app 目录中的一个。每个 node_modules 目录只包含一个 mongoose 目录。 User.js 文件是一个简单的猫鼬模型:

exports.User = function() 
    var mongoose = require('mongoose');
    var Schema = mongoose.Schema;

    var UserSchema = new Schema(
        email:       type: String ,
        firstName:   type: String ,
        lastName:    type: String ,
    );

    mongoose.model("User", UserSchema);
    var User = mongoose.model("User");
    return User;
();

主应用 app.js 如下所示:

var mongoose = require("mongoose");
mongoose.connect("mongodb://localhost:27017/crnapi");
require("../User").User.find(function(err, users) 
    if(err)
        console.log(err);

    console.log("here");
);

除了连接到 mongo 并找到用户之外什么都没有。我看到的问题是对 find() 的调用只是挂起——从未调用过回调。

但是,如果我删除内部 node_modules 目录(应用程序文件夹中的那个),它可以正常工作。这就像内部 node_modules 的存在以某种方式搞砸了猫鼬的工作。我知道我可以将所有内容都放在外部 node_modules 中,然后删除内部的,但我有理由不这样做。

谁能告诉我这里发生了什么?是否有可以运行 node 或 mongoose 的调试模式来告诉我它挂断了什么?

【问题讨论】:

我刚刚发生了一些事情。是否有可能正在创建和使用两个单独的 mongoose 实例? app.js 将使用来自内部 node_modules 的那个,而 User.js 将使用来自外部 node_modules 的那个。也许我有两个单独的连接到 mongodb 运行? 你是对的,你会得到两个独立的 Mongoose 实例。您加载到“User.js”模块中的那个可能永远不会获得连接。因此,查询只是排队(这是默认的 Mongoose 行为)。如果你想保留你当前的结构(不知道为什么你想要两个 node_modules 目录),你可以创建一个模块,它的唯一工作是返回一个 mongoose 对象(也可能在它上面调用 connect)。 阅读nodejs.org/api/… 了解需要“命名”模块(即,不是相对路径)的工作原理。 实际上,如果您确保 app/node_modules 目录中没有 mongoose 模块,我认为它可以“按原样”工作。 谢谢大家,这似乎是问题所在。如果我从 app.js 中取出 mongoose.connect() 调用并将其移动到 User.js 中,那么 app.js 就没有任何 mongoose,它可以工作。我可能只是将猫鼬的东西移到最高的全局 node_modules 目录。这应该让所有模块都使用相同的模块。 【参考方案1】:

问题是我创建了多个 mongoose 实例,而不是创建一个并让所有代码都使用它。我通过将 mongoose 模块移动到一个足够高的目录来解决这个问题,这样所有使用 mongoose 的代码都可以访问同一个。

【讨论】:

以上是关于Node.js node_modules 相互干扰的主要内容,如果未能解决你的问题,请参考以下文章

将具有 node_modules 的本地 Node.js 项目 Git 存储库推送到 Heroku 时,本地 node_modules 是不是会覆盖 Heroku 上的那些?

Heroku+Node.js 如何克隆 node_modules?

在 Dockerized Node.js 开发环境中处理 node_modules 的干净实用的方法?

与 webpack 捆绑时如何使 node.js 在没有 node_modules 的情况下工作?

Node.js初始化工程时加载全部的node_modules

将 node_modules 目录放入 Git 仓库的优点