mongodb增量编号 - 500内部服务器错误

时间:2014-06-26 03:10:33

标签: node.js mongodb express

我正在尝试使用node和mongodb对我的文档的id进行编号。我收到500内部服务器错误:'无法读取属性'seq'为null。

//提交故障单 - 返回500错误 - 不更新ID

router.post('/ticketform', function(req, res){
    var db = req.db;

function getNextSequence(name, callback){
    db.counters.findAndModify(
        {
            query:{ _id:name},
            update:{$inc:{seq:1} },
            new:true
        }, callback
    );
}

    getNextSequence('ticket', function(err, obj) {
        if (err) console.error(err);
        db.users.insert(
        {
            '_id': obj.seq,
            'firstname':req.body.firstname,
            'lastname':req.body.lastname,
            'email':req.body.email,
            'phone':req.body.phone,
            'issue':req.body.issue
        }, function(err,docs) {
            if (err) console.error(err);
            console.log(docs);
            res.end();
        });
    });
});

2 个答案:

答案 0 :(得分:1)

你可能指的是this tutorial.。在示例中,它们显示了MongoDB shell中的实现,其中findAndModify是同步的。正如JohnnyHK在注释中指出的那样,Node.js中的findAndModify是异步的,结果在回调中返回。

在Node.js中你会做这样的事情:

function getNextSequence(name, callback){
    db.counters.findAndModify(
        { "_id": "ticket" },
        [],
        { "$inc": { "seq": 1 }},
        { "new": true, "upsert": true },
        callback
    );
}

getNextSequence('ticket', function(err, obj) {
    if (err) console.error(err);
    db.users.insert(
    {
        '_id': obj.seq,
        'firstname':req.body.firstname,
        'lastname':req.body.lastname,
        'email':req.body.email,
        'phone':req.body.phone,
        'issue':req.body.issue
    }, function(err,docs) {
        if (err) console.error(err);
        console.log(docs);
        res.end();
    });
});

您还应该检查the documentation命令以更好地理解选项。

答案 1 :(得分:1)

您似乎正在使用节点本机驱动程序,其中语法与mongodb shell略有不同。 .findAndModify()函数的工作方式完全不同。

作为一个完整的工作示例,您可以使用此代码,以及异步模块的使用,使逻辑看起来更清晰:

var async = require("async"),
    mongodb = require("mongodb"),
    MongoClient = mongodb.MongoClient;


MongoClient.connect('mongodb://localhost/test',function(err,db) {

    async.waterfall(
        [
            function(callback) {
                db.collection("counters").findAndModify(
                    { "_id": "ticket" },
                    [],
                    { "$inc": { "seq": 1 } },
                    { "upsert": true, "new": true },
                    function(err,doc) {
                        callback( err, doc.seq );
                    }
                );
            },
            function(seq, callback) {
                var doc = { "_id": seq };
                db.collection("users").insert(
                    { "_id": seq },
                    function(err, doc) {
                      callback( err, doc );
                    }
                );
            }
        ], function( err, result ) {

            console.log( result );
        }
    );
});

该函数的参数是“查询”,“排序”,这是一个数组,即使空白也需要,然后是“更新”文档,“选项”,您希望更新文档返回以及“upsert” “创建一个没有匹配文档的新文档,  最后是回调。

异步瀑布允许您“传递”结果,而无需在用于获取序列的方法的回调中嵌入您的功能。你不需要这样做,但代码看起来更清洁,并且直接用于它的目的。

如果你想在.findOneAndUpdate()中使用具有辅助功能的选项,也可以使用mongoose等选项。您可能会发现使用该库可以更轻松地进行连接管理,但这取决于您。