Node.js lambda AWS环境中的nodejs中止提取
我设法在本地环境的nodejs中安装了一个工作中止控制器,非常简单:Node.js lambda AWS环境中的nodejs中止提取,node.js,aws-lambda,Node.js,Aws Lambda,我设法在本地环境的nodejs中安装了一个工作中止控制器,非常简单: const signal = controller.signal; setTimeout(() => controller.abort(), 5000); fetch(url, { signal }).then(response => { return response.text(); }).then(text => { console.log(text); }); 因此,我可以在n秒后中止请求
const signal = controller.signal;
setTimeout(() => controller.abort(), 5000);
fetch(url, { signal }).then(response => {
return response.text();
}).then(text => {
console.log(text);
});
因此,我可以在n秒后中止请求。它在本地环境中工作时不会出现问题,但是在Lambda中部署到AWS时,最终会出现错误
TypeError:预期信号是中止信号的实例
在挖掘fetch模块源代码后,似乎这一行是罪魁祸首:
!isAbortSignal(信号)
从该函数::
function isAbortSignal(signal) {
const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal);
return !!(proto && proto.constructor.name === 'AbortSignal');
}
local中的proto.constructor.name
正确为“AbortSignal”,而在AWS lambda中,它最终只是“a”
我四处搜索,但我找不到任何关于为什么这不起作用的具体信息。有什么提示吗?您正在使用节点获取模块吗?本机NodeJ中不存在fetch和AbortController。您需要为每个节点使用nodejs polyfill
看起来它应该在node fetch v3中修复(目前处于测试版) 在我的例子中,我在将代码上传到AWS之前使用Webpack捆绑,升级到3.0.0-beta.4之后,它起到了作用 如果您无法升级并使用网页包,请尝试:
optimization: {
minimizer: [
new TerserPlugin({
terserOptions: {
mangle: false,
keep_classnames: true,
keep_fnames: true,
},
}),
],
},
如果不起作用,尝试配置优化。将最小化为false