我试图在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 success'
我向'/async'发出请求,并立即向'/'发出另一个请求。我的期望是,当'/async'仍在进行时,node.js将在同时处理'/'路由并立即发送响应。但我观察到'/'只有在'/async'返回后才返回,即。'/async'路由阻塞了整个服务器。
有人能解释为什么'/'正在等待'/async'完成,我该如何解决这个问题?
您的/async
路由处理程序没有阻塞服务器。
但是,你的两个路由都试图联系同一个http://localhost:30000
主机,所以它显然没有从/
返回响应,直到/cpu
完成。
如果你用res.send("done")
代替/
的第二条路线,你应该会看到它在/cpu
路线之前完成。
实际上,两个axios()
调用是并行运行的,您将按照axios()
调用完成的顺序看到结果。因此,哪个请求首先完成将与哪个axios()
调用首先完成有关。
并且,如果http://localhost:30000
是同一台服务器,那么运行这两个请求处理程序的代码也会考虑到这个等式,因为它们都将竞争相同的cpu。