nodejs在Lambda AWS环境中中止获取

时间:2020-01-14 16:29:06

标签: 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秒后中止请求。它在本地环境中没有问题,但是当以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”。

我四处搜寻,但找不到任何无法解决问题的具体信息。有什么提示吗?

2 个答案:

答案 0 :(得分:0)

您是否正在使用 node-fetch 模块? fetch AbortController 在本机nodejs中不存在。您需要为每个使用nodejs polyfill。

https://www.npmjs.com/package/node-abort-controller

答案 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