我正在尝试使用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();
});
});
});
答案 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等选项。您可能会发现使用该库可以更轻松地进行连接管理,但这取决于您。