【问题标题】:With Node.js, Express when the end of a route is hit does all asynchronous code that has not yet completed stop?使用 Node.js,Express 当路由结束时是否所有尚未完成的异步代码都停止?
【发布时间】:2021-01-06 12:57:06
【问题描述】:

环境: Node.js、Express

问题:当到达路由的末端时,所有尚未完成的异步代码都会停止吗?我已经试验了几个小时,这似乎是真的,但有明确的答案吗?

示例:在下面的简化示例中,当/ 路由被调用时,getInfoAndSaveIt 被调用。这个函数有一个很慢的 fetch 调用,然后是一个很慢的数据库保存。在路由中,程序肯定会在函数完成之前到达res.render('homepage'); 行。在这种情况下,homepage 是否渲染以及函数中尚未完成的所有异步代码停止?或者,即使路由结束,异步代码是否会在后台继续运行?

app.get('/', function(req, res) {
    
    getInfoAndSaveIt();
        
    res.render('homepage');
});

function getInfoAndSaveIt() {

    let randomData = fetch('https://www.example.com/data.txt');

    User.updateOne({ data: randomData }, { id: 'abc123' });
}

【问题讨论】:

    标签: node.js express asynchronous async-await


    【解决方案1】:

    在 Node.js 中,当到达路由的末尾时,Express 是否会停止所有尚未完成的异步代码?

    没有。异步代码有自己的想法,与特定路由没有直接联系。例如,假设您正在使用一些异步代码来进行一些日志记录。您发送响应,然后调用一些异步代码来记录一些数据。该记录将继续正常进行。它与路线没有直接联系。它只是在解释器中运行的 Javascript。

    至于你的例子:

    在这种情况下,主页渲染和函数中尚未完成的所有异步代码是否停止?

    是的,主页将呈现。您的异步代码将自行完成。

    或者,即使到达路由的末端,异步代码是否会在后台继续运行?

    是的,异步代码自行继续。

    试试这个简单的例子:

    app.get('/', function(req, res) {
        setTimeout(() => {
            console.log("timer fired");
        }, 2000);
        res.render('homepage');
        console.log("done rendering page");
    });
    

    当你点击这条路线时,你会在服务器日志中看到:

    done rendering page
    timer fired
    

    作为路由完成后异步操作继续进行的证据。

    请记住,在 node.js 中处理路由只是另一个异步操作。这不是一些神奇的过程或线程的事情。它只是传入的http请求触发的异步操作。因此,没有任何神奇的属性可以找到由此启动的所有异步操作并以某种方式杀死它们。这不是 node.js 的工作方式。恰恰相反。一旦你启动它们,它们就会有自己的想法,并且无论进程中正在进行什么其他操作,它们都会完成,除非进程崩溃或你专门调用 process.exit()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-04
      • 2018-06-15
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 2020-05-14
      相关资源
      最近更新 更多