我正在使用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。
express-timeout
4分钟后,我终于看到408状态和“超时错误”作为响应对象的一部分。
对于到其他路线的请求,我net::ERR_EMPTY_RESPONSE在4分钟后收到错误消息。
net::ERR_EMPTY_RESPONSE
如果我记录的值server.timeout,则值为120000(2分钟)。
server.timeout
120000
我的问题
我已经使用以下路由配置解决了它:
'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(); }
我希望此参考资料对其他人有用。