一尘不染

每个路由的节点Express特定超时值

node.js

我正在使用Express v4.13.4开发Node v4.2.4应用程序。现在,我想增加特定上传路由的超时时间。

根据我的阅读和经验:

但是,当尝试为上载路由实现连接超时中间件时,我迷路了。

应用设置

const app = express();
app.use(cors());
app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({ limit: '50mb', extended: false }));
app.use(passport.initialize());

app.use('/uploads', uploadRoutes);
app.use(errorHandler);

function errorHandler(err, req, res, next) {
  if (err.code && err.code === 'ETIMEDOUT') {
    if (!res.headersSent) {
      res
        .status(408)
        .send({
          success: true,
          message: 'Timeout error'
        });
    }
  }

  next(err);
}

const server = app.listen(config.port);

上传路线定义

router.route('/:uploadId/upload-files')
  .post(timeout('3m'),
    require('./actions/upload-files').prepareHandler,
    require('./actions/upload-files').uploadHandler(),
    require('./actions/upload-files').responseHandler);

但是,当我上传文件时,express-timeout仅在命令行控制台上3分钟后我才看到错误。该请求仍在进行中,没有返回状态码408。

4分钟后,我终于看到408状态和“超时错误”作为响应对象的一部分。

对于到其他路线的请求,我net::ERR_EMPTY_RESPONSE在4分钟后收到错误消息。

如果我记录的值server.timeout,则值为120000(2分钟)。

我的问题

  • 4分钟可能从哪里来?是否因为可能有一个先前的OPTIONS请求?
  • 服务器和套接字超时之间有什么区别,以及如何针对特定路由正确设置它们?

阅读 311

收藏
2020-07-07

共1个答案

一尘不染

我已经使用以下路由配置解决了它:

'use strict';

const ms = require('ms');
const express = require('express');
const router = express.Router();

router.route('/upload-files')
  .post(
    setConnectionTimeout('12h'),
    require('./actions/upload-files').responseHandler
  );

function setConnectionTimeout(time) {
  var delay = typeof time === 'string'
    ? ms(time)
    : Number(time || 5000);

  return function (req, res, next) {
    res.connection.setTimeout(delay);
    next();
  }
}

exports.router = router;

其中的关键逻辑是以下中间件:

  function (req, res, next) {
    res.connection.setTimeout(delay);
    next();
  }

我希望此参考资料对其他人有用。

2020-07-07