1

$.post() を使用して AJAX 投稿要求を作成するために、フロントで jQuery を使用しています。また、返されたデータで何かを行う成功関数も渡します。私のnode.jsサーバーでは、エクスプレスを使用してリクエストを処理しています。ポストリクエストは、コールバックで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 に答える