簡體   English   中英

Node.js 和 Express:如何在異步操作后返回響應

[英]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然后訪問querysend函數中的一個變量。


出於分離關注點的目的,您可能最好不要傳遞回調。

然后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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM