猿问

nodejs 如何设置http 请求的超时时间

场景: 我需要在nodejs中调用一个处理时间较长的接口吗,可能会超过120s。


nodejs 默认的 http 请求超时时间超过120s,则会返回超时。

问题:


如何修改默认的超时时间呢?

最好是针对某个请求修改,不要影响到其他请求。


Koa示例:


router.get('/list', async (ctx) => {

    // 设置处理过程超过120s

    let data = await timeoutService(121000)

    ctx.status = 200;

    ctx.body = {

        success: true,

        data: data

    };

});

使用nodejs调用


// nodejs 调用

const GetList = (data) => {

  return new Promise((resolve, reject) => {

    let bs = JSON.stringify(data)

    console.log(bs)

    let encode = new Buffer(bs).toString('base64')

    let postData = JSON.stringify({ data: encode})

    var opt = {

        method: 'GET',

        host: 'localhost',

        port: 3100,

        path: '/list',

        headers: {

            'Content-Type': 'application/json',

            'Content-Length': Buffer.byteLength(postData),

            'Accept': 'application/json; charset=utf-8'

        }

    }

function getTimeLast(label, startTime) {

    let finishTime = Date.now()

    let last = (finishTime - startTime) / 1000

    console.log(`${label} ${last}`)

}


let startTime = Date.now()

GetList({a: 1}).then(res => {

    console.log(res)

    getTimeLast('成功返回用时:', startTime)

}).catch(e => {

    console.log(e)

    getTimeLast('失败返回用时:', startTime)

}) 

结果返回如下:


{"a":1}

{ Error: socket hang up

    at createHangUpError (_http_client.js:331:15)

    at Socket.socketOnEnd (_http_client.js:423:23)

    at emitNone (events.js:111:20)

    at Socket.emit (events.js:208:7)

    at endReadableNT (_stream_readable.js:1055:12)

    at _combinedTickCallback (internal/process/next_tick.js:138:11)

    at process._tickCallback (internal/process/next_tick.js:180:9) code: 'ECONNRESET' }

请求遇到问题:socket hang up

socket hang up

失败返回用时: 120.018


阿波罗的战车
浏览 7708回答 2
2回答

弑天下

这个问题应该是我没有定位好问题所在。我自己梳理了一下。timeout 可以理解成耐心值,客户端发送请求时,可以设置自己的timeout。同时服务端也有自己的耐心值,二者互不干涉,二者都有权在超时后丢掉链接。客户端发送请求时,如果在客户端timeout 时间内,服务端仍没有返回,那么它会终止这个请求。如果客户端足够耐心(timeout 够大),但中间服务器没有耐心,客户端也会收到一个504 timeout如果目标服务器在超时后仍未返回,那么链接也会关闭,客户端不会收到返回。所以确实是可以使用request.setTimeout来设置请求的timeout的,但是这个值不能超过服务器本身最大的限制。比如server.timeout = 5000;即使在setTimeout 中设置6000,仍是不生效的。所以如果瓶颈在与接口服务器的超时限制,修改客户端的超时时间是无济于事的。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答