node.js - Express 请求第二次触发

标签 node.js express

我在这里有点停顿。

我正在创建一个 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/

相关文章:

Node.js:如何保证我们在异步编程中回复正确的请求?

git - Heroku 推送失败

node.js - Mongoose 查询返回 'undefined' `

node.js - mongoose.connect 连接到 mongodb 后不调用回调

javascript - 如何解析 multer 返回的 javascript 对象?

javascript - 使用客户端和服务器在两个单独的文件夹中将 Node 应用程序部署到 heroku

javascript - 在 Express 应用程序中使用 Nunjucks

javascript - 如果存在则追加到列表或在 dynamoDB 中添加列表

node.js - HTTP 请求流在读取固定大小时无法触发可读

node.js - Nodejitsu 上使用 Express 的 HTTPS