node.js 事件循环如何工作以及它如何处理多个请求?

问题描述 投票:0回答:1

我试图在 node.js 中测试一些异步代码。我的理解是,如果正在进行一些异步操作,Node.js 我们将处理新请求。我使用 express 和 axios 编写了如下简单的代码。

app.get('/async', (req, res) => {
    axios({
        method: 'get',
        url: 'http://localhost:30000/cpu',
        headers: { 'fibo': '45' }
    })
        .then(ress => {
            console.log(ress)
            res.send('Async success')
        })
        .catch(err => {
            console.log('failed')
            console.log(err)
            res.send('failed')
        })
})
app.get('/', (req, res) => {
    axios({
        method: 'get',
        url: 'http://localhost:30000/'
    }).then(function (response) {
        res.send('Hello World')
    }).catch((err) => {
        res.send('Something wrong happened')
    })

})

向 http://localhost:30000/cpu 发出请求大约需要 15 秒才能完成。因此,当我们为此服务器向 /async 发出请求时,它会依次向“http://localhost:30000/cpu”发出请求,这需要一些时间。一旦我们得到响应,我的服务器将返回一条消息“异步成功”

我向“/async”发出请求,并立即向“/”发出另一个请求。我的期望是,当 '/async' 仍在继续时,node.js 将同时处理 '/' 路由并立即发回响应。但我观察到 '/' 仅在 '/async' 返回后才返回,即 '/async' 路由阻塞了整个服务器。

有人能解释为什么“/”要等到“/async”完成吗?我该如何解决这个问题?

javascript node.js asynchronous callback
1个回答
0
投票

/async
的路由处理程序没有阻塞服务器。

但是,您的两条路线都试图联系同一个

http://localhost:30000
主机,因此在
/
完成之前,它显然不会从
/cpu
返回响应。

如果您为

/
走第二条路线并将其替换为
res.send("done")
,您应该在
/cpu
路线之前看到它完成。

实际上,两个

axios()
调用是并行运行的,您将按照
axios()
调用完成的顺序看到结果。因此,哪个请求先完成将与哪个
axios()
调用先完成有关。

而且,如果

http://localhost:30000
是同一个服务器,那么运行这两个请求处理程序的代码也会影响这个等式,因为它们都将竞争同一个 cpu。

© www.soinside.com 2019 - 2024. All rights reserved.