我有以下代码
api.stuff_by_id = function (req, res) {
var collection = collectionName;
var search = getLuceneSearchString(req.body);
luceneDb.search(collection, search)
.then(function (result) {
var result_message = result.body;
console.log(result_message);
res.send(result); // this is the response I'd actually like to see returned.
})
.fail(function (err) {
console.log(err);
res.send(err); // or this one if there is an error.
})
res.send('test'); // however this is the only one that gets returned.
};
我意识到,在针对此调用执行curl请求时将显示的唯一响应是最后一个响应,因为其他响应仍在处理一瞬间。但是我实际上需要让res.send(result)或res.send(err)调用给出响应而不是res.send(' test')。有什么方法可以使服务器等待响应其中一个正确的响应?有没有办法等待某种方式或其他方法来做到这一点?
谢谢!
解决方案 (@ NotMyself在下面回答,但帮助我离线了解以下代码)。解决方案相当容易,但最初并不完全明显。
我们将抽象提升到了更好的水平,其中api.stuff_by_id刚刚返回了luceneDb.search函数返回的promise的承诺。一旦它被冒泡到上层,然后使用,然后在完成承诺的完成后,将响应(res.send)发送回客户端。这是以后方法的样子。
帖子的功能设置如下:
app.post('/identity/by',
passport.authenticate('bearer', { session: false}),
function (req, res) {
luceneDb.search(req.body)
.then(function (result) {
res.send(result);
})
.fail(function (err) {
res.statusCode = 400;
res.send(err);
});
});
和luceneDb.search函数如下所示:
luceneDb.search = function (body) {
var collection = data_tier.collection_idents;
var search = getLuceneSearch(body);
if (search === '') {
throw new Error
'Invalid search string.';
}
return orchestrator.search(collection, search)
.then(function (result) {
var result_message = result.body;
console.log(result_message);
return result.body;
})
};
也减少了对问题的泄漏。
答案 0 :(得分:2)
您需要删除res.send(' test');.你把它写成发送的方式将在承诺发生变更之前完成请求。
答案 1 :(得分:1)
res.send(' test')的问题是响应将在Lucene调用结束之前发送给客户端,因此,客户端已经消失了有第二个res.send。
关于承诺,我使用.them(函数(结果){},函数(错误){});不是.then()。fail(),你用什么模块?
对于LuceneDB你也使用什么模块?我只是好奇。