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

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

从我读过的和经历过的

  • 默认的节点服务器超时是2分钟
  • 节点套接字默认没有超时
  • 有Express的中间件来处理超时

但是,在尝试实现上传路由的连接超时中间件时,我迷路了。

应用程序设置

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); 

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

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

对于其他路由请求,4分钟后我得到net::ERR_EMPTY_RESPONSE错误。

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

我的问题

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

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

 '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(); } 

我希望这个参考文献能够派上用场。