【问题标题】:504 Gateway Timeout error on Express.js when a timer is running计时器运行时 Express.js 上的 504 Gateway Timeout 错误
【发布时间】: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


【解决方案1】:

根据 cmets,问题是同步请求阻止路由侦听器及时响应。

【讨论】:

    猜你喜欢
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    相关资源
    最近更新 更多