跳到主要内容

云函数运行时Node.js16 ETIMEDOUT问题

云函数运行时Node.jsV16版本运行机制有调整,可能导致ETIMEDOUT问题。

问题现象

函数执行失败,且失败的报错信息中包含 ETIMEOUT、ESOCKETTIMEOUT 等信息,且函数执行时间仅有几毫秒。

问题原因

异步调用回调被触发时,可能串到之后的某次调用中。如果异步回调中抛出一个异常,运行时会捕获这个uncaughtException异常,并认为是本次云函数调用执行有问题,并将异常作为云函数运行结果返回。

复现代码

function nowISOString() {
return new Date().toISOString()
}

exports.main = async function (event, context) {
console.log('request start', context.request_id, nowISOString())
setTimeout(() => {
throw new Error('ETIMEDOUT' + context.request_id)
}, 6000)
console.log('request finish', context.request_id, nowISOString())

await new Promise((resolve) => {
setTimeout(() => {
resolve()
}, 3000)
})
return 'success'
}

解决方式

  1. 使用v10或v12版本:如果可能,建议使用Node.js的v10或v12版本。
  2. 检查异步代码:检查代码中是否存在没有await的异步调用,并确保所有异步操作都被正确等待。

更多信息

云函数Node.js 14.18、Node.js 16.13等版本运行时有变化,不再支持某些异步特性。当前出现超时错误问题的原因可能是函数代码中存在没有await等待的异步任务,在函数返回之后仍在运行,这可能会在之后的某次调用中引发问题。

更多详细信息,请参考:云函数异常处理文档