2016-07-10 2 views
5

のある「引数は文字列でなければなりません」私は、ノードにこのようなエラーを取得しました。は、特定のMongoDBのObjectIDのNode.jsの

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

MongoDBを持つ検索操作を行う際の条件は、オブジェクトIDのいくつかの用途でした。いくつかのObjectIDの使用でこのエラーが発生し、一部のエラーは発生しませんでした。重要なのは、ObjectIDがどこから来たのかだけでした。それが既存のコレクションから引き出された場合、それは機能しました。自分で作成した場合(ObjectID.createFromHexStringなど)、上記のように失敗しました。

+0

[docs](https://docs.mongodb.com/manual/reference/method/ObjectId/)のどこでも 'ObjectID.createFromHexString'メソッドが見つかりません。単純に 'ObjectId()'を試しましたか? 'var id = ObjectId(" 507f1f77bcf86cd799439011 ")'? – fracz

+0

https://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.htmlの 'createFromHexString'を検索してください。私は以下の問題であることが判明しました。ありがとう。 –

答えて

2

これを数時間追跡しました。問題はモンゴースの私の使用にまで下がった。私はMongooseスキーマをいくつかのコレクションに使用していましたが、Mongooseは他のコレクションには使用していませんでした。ここに私の問題のあるコードを含むファイルがあります:

connectedDb = db; 

デシベルはmongoose.connectionた:

// 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() { 
}; 

問題はラインであることが判明しました。つまり、私はmongoose.connectionをMongooseを使用していないMongoDB Collectionsのデータベースとして使用していました。これにより断続的なエラーが発生しました。

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"); 
      }); 
     } 
    }); 
}; 
4

変更MongoDBのバージョンを2.1.6に:(!と、これまで取り組んで)次のように

改訂コードがあります。

+0

'mongod --version'が表示されます: dbバージョンv3.0.7 gitバージョン:nogitversion –

+0

私は、node6のバージョンを2.1.6または2.1.17に変更することを意味します。オブジェクトIDを作成すると、バージョンにバグがあります。 @Chris Prince – Vainlyh

+0

私はマングースを使用していない以外はこの問題も抱えていました。解決策はmongodbドライバのバージョンを変更することでした。私の場合、2.2.10は動作しませんでしたが、2.0.28は動作します。誰かがそれを見つける場所を知っている場合、特定のバグレポートへのリンクは素晴らしいでしょう... – schmidlop

関連する問題