“Node.js中的某些MongoDB ObjectID”的参数必须是“string”

我在Node中得到这样的错误:

TypeError: Argument must be a string at TypeError (native) at Buffer.write (buffer.js:791:21) at serializeObjectId <snip> 

这些条件是ObjectID在使用MongoDB进行查找操作时的一些用法。 ObjectID的一些用法引发了这个错误,有些则没有。 唯一重要的是ObjectID来自哪里。 如果它是从现有的collections拉,它的工作。 如果我自己生成它(例如,使用ObjectID.createFromHexString),它失败,如上所述。

将mongodb版本更改为2.1.6。

我花了几个小时跟踪这一个。 问题归结为我使用mongoose。 我为我的一些collections集使用了Mongoose模式,而不是为其他人使用Mongoose。 这是包含我有问题的代码的文件:

 // Some common MongoDb operations and data. 'use strict'; var MongoClient = require('mongodb').MongoClient; var assert = require('assert'); var logger = require('./Logger'); var mongoose = require('mongoose'); // TODO: Take this out for production. mongoose.set('debug, true'); var PSSharingInvitations = require('./PSSharingInvitations') var connectedDb = null; // Call this just once, at the start of the server. // TODO: Need better error handling when can't initially connect. Right now have an ugly looking error when Mongo is not already started and we try to start our server. exports.connect = function(mongoDbURL) { MongoClient.connect(mongoDbURL, function(err, db) { assert.equal(null, err); if (!db) { logger.error("**** ERROR ****: Cannot connect to MongoDb database!"); } else { mongoose.connect(mongoDbURL); var db = mongoose.connection; db.on('error', console.error.bind(console, 'connection error:')); db.once('open', function() { // SCHEMA's exports.SharingInvitation = PSSharingInvitations.buildSchema(mongoose); logger.info("Mongoose: Connected to MongoDb database"); }); connectedDb = db; logger.info("Mongo: Connected to MongoDb database"); } }); }; exports.db = function () { return connectedDb; }; // Call this just once, when the server shuts down. exports.disconnect = function() { }; 

问题原来是这样的:

 connectedDb = db; 

哪里db是mongoose.connection 。 也就是说,我正在使用mongoose.connection作为MongoDB的MongoDB的MongoDB集合的数据库。 这造成间歇性错误。

修改的(到目前为止工作!)代码如下:

 exports.connect = function(mongoDbURL) { MongoClient.connect(mongoDbURL, function(err, db) { assert.equal(null, err); if (!db) { logger.error("**** ERROR ****: Cannot connect to MongoDb database!"); } else { connectedDb = db; logger.info("Mongo: Connected to MongoDb database"); mongoose.connect(mongoDbURL); var connectedMongooseDb = mongoose.connection; connectedMongooseDb.on('error', console.error.bind(console, 'connection error:')); connectedMongooseDb.once('open', function() { // SCHEMA's exports.SharingInvitation = PSSharingInvitations.buildSchema(mongoose); logger.info("Mongoose: Connected to MongoDb database"); }); } }); };