我正在使用Express v4.13.4开发Node v4.2.4应用程序。现在我想增加特定上传路由的超时时间。
从我的阅读和经历:
但是,在尝试为上传路径实施connect-timeout中间件时,我迷失了。
应用程序设置
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
错误。
如果我记录server.timeout
的值,则值为120000
(2分钟)。
我的问题
答案 0 :(得分:10)
我使用以下路由配置解决了它:
'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();
}
我希望这个参考文章能为其他人派上用场。
答案 1 :(得分:0)
增加路由超时的简单方法:
app.post('/some_route', (req, res) => {
req.setTimeout(60 * 1000); //use req. this sets timeout to 60 seconds
});
或
如果你想增加所有路由在服务器上的超时时间,你可以编辑你的 app.js:
var serverApp = app.listen();
serverApp.setTimeout(60 * 1000); //use sets timeout to 60 seconds
显然,请谨慎使用服务器设置。您不想用长请求占用您的服务器,因此大多数情况下使用特定于路由的超时是更好的架构..