使用NodeJS Mongo模块收集collection.insert后的POST响应错误

时间:2016-01-13 23:27:10

标签: javascript node.js mongodb

尝试发布时我遇到此错误

>         process.nextTick(function() { throw err; });
>                                       ^
>     
>     TypeError: first argument must be a string or Buffer
>         at ServerResponse.OutgoingMessage.end (_http_outgoing.js:524:11)

错误表明mongodb模块中的 utils cursor 出了问题,但它们是什么?

在GET上一切都很好但在POST上刹车(邮差和文本传递{“名称”:“计算机”,“价格”:2500}) - 我无法追踪哪个模块或实例正在制动代码。

这是我与db的结合:

// Our primary interface for the MongoDB instance
var MongoClient = require('mongodb').MongoClient;

// Used in order verify correct return values
var assert = require('assert');

var connect = function (databaseName, callBack) {

    var url = 'mongodb://localhost:27017/' + databaseName;

    MongoClient.connect(url,
        function (error, database) {

            assert.equal(null, error);

            console.log("Succesfully connected to MongoDB instance!");

            callBack(database);
        });
};


exports.find = function (databaseName, collectionName, query, callback) {
    connect(databaseName, function (database) {

        var collection = database.collection(collectionName);

        collection.find(query).toArray(
            // Callback method
            function (err, documents) {

                // Make sure nothing went wrong
                assert.equal(err, null);

                // Print all the documents which we found, if any
                console.log("MongoDB returned the following documents:");
                console.dir(documents)

                callback(err, documents);

                // Close the database connection to free resources
                database.close();
            })
    })
};

exports.insert = function (databaseName, collectionName, object, callback) {
    connect(databaseName, function (database) {
        var collection = database.collection(collectionName);
        collection.insert(document, {w: 1}, function (err, documents) {
            console.log("Added a new document");
            console.log(documents[0]);
            callback(err, documents[0]);
        });
    })
};

exports.remove = function (databaseName, collectionName, object, callback) {
    connect(databaseName, function (database) {
        var collection = database.collection(collectionName);
        collection.remove(object, function (err, result) {
            callback(err, result);
            database.close();
        });
    })
};

1 个答案:

答案 0 :(得分:0)

这个问题实际上很简单,所以我很惊讶你没有收到更好的错误信息。

在您的代码中:

collection.insert(document, {w: 1}, function (err, documents) {
  console.log("Added a new document");
  console.log(documents[0]); // I expect this to log undefined
  callback(err, documents[0]);
});

传递给collection.insert回调的第二个参数实际上是结果对象,而不是插入的文档。因此,documents[0]最终成为undefined,因为它不是一系列文档。因此,当您尝试发送undefined作为回复时,它就会失败。

如果您打算传递新创建的文档,则必须使用result对象获取_id并将其附加到您插入的文档中。

作为旁注,我会考虑保持对数据库的连接,而不是每次想要与Mongo交谈时都创建新连接。