1

我在前面使用 jQuery 使用 $.post() 发出 AJAX 发布请求。我还传递了一个成功函数,它将对返回的数据做一些事情。在我的 node.js 服务器上,我使用 express 来处理请求,发布请求调用另一个传递回调的函数,该回调在回调中执行 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);
    });
}
4

3 回答 3

1

如果您向我们展示的代码是真实的代码,那么唯一的可能性是您返回的东西doc实际上是undefined. 客户端上的回调在触发之前res.send()不会触发。

你确定回调insertDocument和你想的完全一样吗?回调通常采用以下形式function(err,doc),即试试这个:

app.post('/newgroup/', function(req, res){
    insertDocument({name:req.body.name, photos:[]}, db.groups, function(err, doc){
        res.send(doc); 
    });
});
于 2013-09-20T20:28:55.673 回答
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);
     });
}
于 2013-09-20T21:59:09.763 回答
0

可能是同步/异步问题吗?我不知道您使用什么库进行保存,但是否有这样的调用应该更像这样的情况?

targetCollection.insert(doc, function(err, saveddoc) {
    if (err) console.log(err);
    callback(saveddoc);
});
于 2013-09-21T17:48:50.053 回答