2016-08-10 30 views
1

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

从我读过的和经历:

然而,试图执行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); 

然而,在上传文件时,我看到从express-timeout误差仅在命令行控制台3分钟后。该请求仍在进行中,并且不返回状态码408。

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

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

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

我的问题

  • 在哪里可以四分钟一可能是从哪里来的?是否因为可能有前面的OPTIONS请求?
  • 服务器&套接字超时与如何针对特定路由正确设置它们有什么区别?

回答

5

我使用下面的路由配置解决了这个问题:

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

我希望这个参考能派上用场他人。