我在前面使用jQuery使用$ .post()发出AJAX帖子请求。我还传递了一个成功函数,它将对返回的数据执行某些操作。在我的node.js服务器上,我使用express来处理请求,post请求调用另一个函数传递一个回调,在回调中执行res.send()。在回调完成之前,如何才能完成请求?
我的客户端代码是:
$.post("/newgroup/", {name: newgroupname}, function(data) {
console.log(data); // Returns undefined because requests ends before res.send
});
我的服务器端代码是:
app.post('/newgroup/', function(req, res){
insertDocument({name:req.body.name, photos:[]}, db.groups, function(doc){
res.send(doc);
});
});
insertDocument函数是:
function insertDocument(doc, targetCollection, callback) {
var cursor = targetCollection.find( {}, {_id: 1}).sort({_id: -1}).limit(1);
cursor.toArray(function(err, docs){
if (docs == false){
var seq = 1;
}
else {
var seq = docs[0]._id + 1;
}
doc._id = seq;
targetCollection.insert(doc);
callback(doc);
});
}
答案 0 :(得分:1)
如果您向我们展示的代码是真实代码,则唯一的可能性是您返回的内容doc
实际上是undefined
。 <{1}}触发前,客户端上的回调不会触发。
您确定res.send()
中的回调完全符合您的想法吗?通常回调的形式为insertDocument
,即试试这个:
function(err,doc)
答案 1 :(得分:0)
好的,我找到了答案,我不知道为什么会这样,我只需要更改我发送给回调的变量的名称,我认为这是因为它与参数具有相同的名称,所以我我的insertDocument函数改为看起来像这样
function insertDocument(doc, targetCollection, callback) {
var cursor = targetCollection.find( {}, {_id: 1}).sort({_id: -1}).limit(1);
cursor.toArray(function(err, docs){
if (docs == false){
var seq = 1;
}
else {
var seq = docs[0]._id + 1;
}
doc._id = seq;
targetCollection.insert(doc);
var new_document = doc;
callback(new_document);
});
}
答案 2 :(得分:0)
可能是同步/异步问题吗?我不知道你用的是什么库用于你的保存,但是这个电话应该更像这样吗?
targetCollection.insert(doc, function(err, saveddoc) {
if (err) console.log(err);
callback(saveddoc);
});