2016-08-10 34 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(); 
    } 

我希望這個參考能派上用場他人。