节点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(); }
我希望这个参考文献能够派上用场。