云函数运行时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'
}
解决方式
- 使用v10或v12版本:如果可能,建议使用Node.js的v10或v12版本。
- 检查异步代码:检查代码中是否存在没有
await
的异步调用,并确保所有异步操作都被正确等待。
更多信息
云函数Node.js 14.18、Node.js 16.13等版本运行时有变化,不再支持某些异步特性。当前出现超时错误问题的原因可能是函数代码中存在没有await
等待的异步任务,在函数返回之后仍在运行,这可能会在之后的某次调用中引发问题。
更多详细信息,请参考:云函数异常处理文档