【问题标题】:'process.nextTick(function() { throw err; })' - Undefined is not a function (mongodb/mongoose)'process.nextTick(function() { throw err; })' - 未定义不是函数 (mongodb/mongoose)
【发布时间】:2015-06-09 13:07:57
【问题描述】:

我正在尝试使用 nodejs 和 socket.io 连接到我的 mongodb。我能够连接到数据库,因为我在控制台中获得了“连接已接受”,但在 nodejs 端,只要我 - 确实 - 得到 ​​p>

通过 mongoose 建立到 mongodb://localhost:27017 的连接

接下来会立即失败

process.nextTick(function() { throw err; }) ^TypeError: undefined is 不是 showCollections 中的函数**

这里是 showCollections:

var showCollections = function(db, callback) { 
    mongoose.connection.db.collectionNames(function(error, names) {
    if (error) {
      throw new Error(error);
    } else {
        console.log("=>Listening mongo collections:");
      names.map(function(cname) {
        mongoose.connection.db.dropCollection(cname.name);
        console.log("--»"+cname.name);
      });
    }
  });

}

这是我的数据库文件夹的内容:

_tmp (empty folder)
local.0
local.ns
mongod.lock

我通过键入 mongod --dbpath 文件夹 运行 mongodb,它成功地“等待端口 27017 上的连接”。

另外,我的 node_modules 来自 package.json (npm)

"dependencies": {
    "express": "^4.9.6",
    "socket.io": "latest",
    "mongodb": "~2.0",
    "mongoose": "*"
  }

非常感谢您的帮助...

堆栈跟踪:

> TypeError: undefined is not a function
>     at showCollections (/usr/share/nginx/www/index.js:77:25)
>     at NativeConnection.callback (/usr/share/nginx/www/index.js:46:3)
>     at NativeConnection.g (events.js:199:16)
>     at NativeConnection.emit (events.js:104:17)
>     at open (/usr/share/nginx/www/node_modules/mongoose/lib/connection.js:485:10)
>     at NativeConnection.Connection.onOpen (/usr/share/nginx/www/node_modules/mongoose/lib/connection.js:494:5)
>     at /usr/share/nginx/www/node_modules/mongoose/lib/connection.js:453:10
>     at /usr/share/nginx/www/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js:59:5
>     at /usr/share/nginx/www/node_modules/mongoose/node_modules/mongodb/lib/db.js:200:5
>     at connectHandler (/usr/share/nginx/www/node_modules/mongoose/node_modules/mongodb/lib/server.js:272:7)

编辑:

我在尝试运行 nodejs 实例时也遇到了这些问题:

{ [Error: Cannot find module '../build/Release/bson'] code: 'MODULE_NOT_FOUND' }
js-bson: Failed to load c++ bson extension, using pure JS version

我尝试修复它们,因为这里的其他问题会告诉你,但也没有任何效果......

【问题讨论】:

  • 你能发布打印出来的实际堆栈跟踪吗?这应该会告诉您 哪里showCollections() 中错误源自。
  • @mscdex 如何打印堆栈跟踪?它应该默认打印吗?
  • 是的,它应该已经显示在你得到的 TypeError 下。
  • @mscdex 我更新了问题
  • showCollections() 中的第 75 行是哪一行?

标签: node.js mongodb mongoose socket.io


【解决方案1】:

您不应该指定完整路径并拥有一个导出模块吗?
...类似于:

mongoose.connection.db.collectionNames(function (err, names)
{
        console.log(names); // [{ name: 'dbname.myCollection' }]
        module.exports.Collection = names;
}

如果我错了,那是因为我不喜欢moongodb :)

【讨论】:

  • 我真的不认为这是必要的,如果我明白你的意思......我不认为我的问题出在那儿......
  • 运行 db.getCollectionNames() 的结果是什么?
  • 同样...所以问题可能在于获取集合名称,无论出于何种原因!
【解决方案2】:

从提供的信息来看,您使用的是 mongodb 2.0 驱动程序。 db.collectionNames 方法已被删除。查看此页面的“Db 对象”部分 - https://github.com/mongodb/node-mongodb-native/blob/0642f18fd85037522acf2e7560148a8bc5429a8a/docs/content/tutorials/changes-from-1.0.md#L38

他们已将其替换为 listCollections。你应该得到同样的效果:

mongoose.connection.db.listCollections().toArray(function(err, names) {
    if (err) {
        console.log(err);
    }
    else {
        names.forEach(function(e,i,a) {
            mongoose.connection.db.dropCollection(e.name);
            console.log("--->>", e.name);
        });
    }
});

【讨论】:

  • 如果有帮助:我在使用 bluebird 的 Promise.promisifyAll(mongoose.connection.db) + 包 asyncawait 后尝试使用 listCollectionsAsync(),但没有成功(无缘无故地调用 listCollectionsAsync() 时挂起)。然而,在console.log(mongoose.connection.db) 检查可用方法之后,我发现了一个未记录的collectionsAsync(),它完美地工作 O_o (mongoose 4.3.7)
【解决方案3】:

对我来说,当我不得不强行关闭我的电脑时,这个错误开始出现,因为它变得无响应。下次我启动我的快递服务器时,会弹出这个错误。我通过在终端中运行npm install mongoose@4.0 --save 解决了这个问题。 当您的服务器或数据库被强制关闭并且某些代码未在后台保存在mongod中时,可能会弹出此错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 2021-07-18
    • 2018-08-14
    相关资源
    最近更新 更多