我设法在本地环境的nodejs中使工作中止控制器工作,就像这样简单:
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: Expected signal to be an instanceof AbortSignal
在深入获取模块的源代码之后,似乎这是罪魁祸首:
!isAbortSignal(signal)
通过此功能::
function isAbortSignal(signal) {
const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal);
return !!(proto && proto.constructor.name === 'AbortSignal');
}
本地的proto.constructor.name
正确为“ AbortSignal”,而在AWS lambda中,它最终只是一个“ a”。
我四处搜寻,但找不到任何无法解决问题的具体信息。有什么提示吗?
答案 0 :(得分:0)
您是否正在使用 node-fetch 模块? fetch 和 AbortController 在本机nodejs中不存在。您需要为每个使用nodejs polyfill。
答案 1 :(得分:0)
看起来应该在node-fetch v3(当前为beta)中对其进行修复
就我而言,在升级到3.0.0-beta.4后,我将Webpack捆绑在一起,然后将代码上传到AWS,
如果您无法升级和使用webpack,请尝试:
optimization: {
minimizer: [
new TerserPlugin({
terserOptions: {
mangle: false,
keep_classnames: true,
keep_fnames: true,
},
}),
],
},
,如果不起作用,请尝试将optimization.minimize
配置为false