【发布时间】:2019-01-29 08:18:13
【问题描述】:
当 JavaScript 计时器每 20 秒运行一次时,我的 Express.js 应用程序出现“504 Gateway Timeout”错误。
这是我的 Express.js 监听器和计时器:
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => res.send('ok.'))
var listener = app.listen(process.env.PORT, function() {
console.log('Your app is listening on port ' + listener.address().port);
});
var items = [
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
]
let forParallel = require('node-in-parallel');
var request = require('sync-request');
setInterval(function() {
forParallel(items, function(listItem) {
request("GET", "https://example.com/?i=" + listItem);
console.log("Done.");
}, function () {
});
}, 20000);
所以,如您所见:我正在使用 node-in-parallel 在数组 items 上每 20 秒并行循环一次......每个循环迭代都应该向 "https://example.com/?i=" + listItem 发出 GET 请求......
所以.. Express.js 在计时器第一次启动之前可以正常工作!但是当定时器启动时 Express.js 返回“504 Gateway Timeout Error”
Express.js 监听器不是异步的吗?
编辑:请注意,GET 请求的过程需要时间(例如每次迭代需要 30 秒),因为它做了一些大事。
【问题讨论】:
-
如果您尝试改用异步请求会怎样?此外,您真的是说它仅在 20 秒后返回 504 吗?除非另有配置,否则不应该在 60 秒后发生吗?
-
@StockOverflaw - 你拯救了我的一天!使用
request模块 ( npmjs.com/package/request ) 而不是sync-request有效!您可以将此作为答案发布。 -
一般用JS来说:如果时间太长,找同步的东西。由于回调、承诺等,JS“似乎”是多线程的,但事实并非如此,它只是基于事件的 single 进程(称为事件循环)。干杯!
标签: javascript node.js express timer