我在这里有点停顿。
我正在创建一个 Express 应用程序,它必须通过单个请求从 Shopify 商店导出大量数据。
问题是,当我到达 2 分钟标记时,请求再次被触发(因为默认超时为 2 分钟),所以我增加了 server.setTimeout()
以考虑时间它需要。
所以这修复了请求在 2 分钟标记处的触发,但是一旦我的请求完成,出于某种原因再次发出第二个请求。
这是该问题的一个简单示例:
const express = require('express');
function sleep(ms){
return new Promise(resolve=>{
setTimeout(resolve,ms)
})
}
app.get('/export', async (req, res) => {
// Sleep for 2:03min
await sleep(123000);
console.log('Starting request');
res.status(200).send('Finish');
})
const server = app.listen(3000, () => {
console.log(`Example app listening on port ${port}`)
})
// Set timeout to 2:04min
server.setTimeout(124000);
如果你打开http://localhost:3000/export上述代码的结果返回:
开始请求
<- 在开头
开始请求
<- 在 2:04 标记处
这是不是因为异步/等待的问题,因为 res.send()
似乎永远不会触发?
有人可以澄清“为什么”会发生这种情况以及“如何”防止这种情况发生吗?
PS:我不能使用标志或其他东西来检查请求是否已经发出,因为 APP 需要为同时导出数据的用户工作,而第二个请求作为一个全新的。
最佳答案
好吧,我今天在这上面浪费了大约 4 个小时,结论是我的 tunel 服务 ( http://serveo.net/ ) 在我的导出完成时的某个时间完美地触发了另一个请求。 (至于为什么,我没有答案)我仍然不确定这是否是正确的结论,但切换到不同的选项(或使用直接本地主机)没有显示任何问题。
我转移到 OpenVPN,我所有的问题都消失了。 Ngrok 也不错,但由于免费版本没有固定的 URL(每天我启动服务时更改应用程序设置中的所有端点很痛苦)我选择了 OpenVPN。
问题的根源在于 res.status(200).send('Finish')
从未因为某些特定原因而触发,或者如果确实如此,它似乎也不是。
感谢所有的帮助。
关于node.js - Express 请求第二次触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55298070/