2016-07-10 25 views
5

ja otrzymuję błąd jak ten w węźle:„Argument musi być ciągiem” z niektórymi MongoDB ObjectID jest w node.js

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

warunki były pewne zastosowania ObjectID użytkownika podczas wykonywania operacji znalezienia z MongoDB. Niektóre zastosowania ObjectID podniosły ten błąd, a niektóre nie. Liczyło się tylko to, skąd pochodzi ObjectID. Jeśli został pobrany z istniejącej kolekcji, zadziałało. Jeśli sam go wygenerowałem (np. Przy użyciu ObjectID.createFromHexString), nie udało się to jak wyżej.

+0

Nie widzę metody 'ObjectID.createFromHexString' w dowolnym miejscu [dokumentów] (https://docs.mongodb.com/manual/reference/method/ObjectId/). Czy próbowałeś po prostu 'ObjectId ()', np. 'var id = ObjectId (" 507f1f77bcf86cd799439011 ")'? – fracz

+0

Wyszukaj 'createFromHexString' w https://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html. Poniżej zamieściłem problem, który okazał się być problemem. Dzięki. –

Odpowiedz

2

Spędziłem kilka godzin śledząc ten jeden. Problem sprowadził się do mojego użycia mangusty. Używałem schematów Mongoose dla niektórych moich kolekcji i nie używałem Mongoose dla innych. Poniżej znajduje się plik zawierający mój problematyczny kod:

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

Problemem okazała się linia:

connectedDb = db; 

Gdzie db był mongoose.connection. To znaczy, użyłem mongoose.connection jako bazy danych dla kolekcji MongoDB, które nie używały Mongoose. Spowodowało to sporadyczne błędy. (! I jak dotąd działa)

Kod zmieniony następująco:

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

Zmień wersję MongoDB do 2.1.6.

+0

'mongod --version' pokazuje: db wersja v3.0.7 wersja git: nogitversion –

+0

Mam na myśli zmianę wersji modułu mongodb na nodejs na 2.1.6 lub 2.1.17. Wersja ma błąd przy tworzeniu objectID. @Chris Prince – Vainlyh

+0

Miałem również ten problem, z wyjątkiem tego, że nie używam mangusty. Rozwiązaniem dla mnie była zmiana wersji sterownika mongodb. W moim przypadku 2.2.10 nie działało, ale 2.0.28 robi. Link do konkretnego raportu o błędzie byłby świetny, gdyby ktokolwiek zdawał się wiedzieć, gdzie go znaleźć ... – schmidlop

Powiązane problemy