[英]Node.js and axios : How to return response after asynchronous request to another server?
[英]Node.js and Express: How to return response after asynchronous operation
我是 Node.js 的新手,所以我仍然在關注異步函數和回調。 我現在的難題是如何在異步操作中從文件讀取數據后返回響應。
我的理解是發送響應是這樣的(這對我有用):
app.get('/search', function (req, res) {
res.send("request received");
});
但是,現在我想讀取一個文件,對數據執行一些操作,然后在響應中返回結果。 如果我想對數據執行的操作很簡單,我可以做這樣的事情——內聯執行它們,並保持對res
對象的訪問,因為它仍在范圍內。
app.get('/search', function (req, res) {
fs.readFile("data.txt", function(err, data) {
result = process(data.toString());
res.send(result);
});
});
但是,我需要執行的文件操作既長又復雜,我已將它們分離到單獨文件中的自己的函數中。 結果,我的代碼看起來更像這樣:
app.get('/search', function (req, res) {
searcher.do_search(res.query);
// ??? Now what ???
});
我需要調用res.send
才能發送結果。 但是,我不能在上面的函數中直接調用它,因為do_search
異步完成的。 我不能在do_search
的回調中調用它,因為res
對象不在那里。
有人可以幫助我理解在 Node.js 中處理這個問題的正確方法嗎?
要訪問不同函數中的變量,當沒有共享范圍時,將其作為參數傳遞。
您可以只傳遞res
然后訪問query
並send
函數中的一個變量。
出於分離關注點的目的,您可能最好不要傳遞回調。
然后do_search
只需要了解執行查詢然后運行函數。 這使它更通用(因而可重復使用)。
searcher.do_search(res.query, function (data) {
res.send(...);
});
function do_search(query, callback) {
callback(...);
}
現有答案完全有效,您也可以使用自 ES2017 以來的 async/await 關鍵字。 使用你自己的函數:
app.get('/search', async(req, res, next) {
try {
const answer = await searcher.do_search(req.query);
res.send(answer);
}
catch(error) {
return next(error);
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.