nodejs отменить выборку в лямбда-среде AWS - PullRequest
0 голосов
/ 14 января 2020

Мне удалось иметь работающий контроллер прерывания в nodejs в локальной среде, что-то вроде этого:

const signal = controller.signal;

setTimeout(() => controller.abort(), 5000);

fetch(url, { signal }).then(response => {
  return response.text();
}).then(text => {
  console.log(text);
});

Так что я могу отменить запрос через n секунд. Он работает без проблемы в локальной среде, однако при развертывании в AWS в лямбда-я I с ошибкой

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 оно заканчивается Я был просто «а».

Я искал вокруг, но не смог найти ничего конкретного c о том, почему это не работает. Любые советы по этому поводу?

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

Похоже, что это должно быть исправлено в node-fetch v3 (в настоящее время в бета-версии)

В моем случае я использую Webpack для пакетирования перед загрузкой кода в AWS, после обновления до 3.0. 0-beta.4 это сработало.

Если вы не можете выполнить обновление и использовать веб-пакет, попробуйте:

optimization: {
    minimizer: [
      new TerserPlugin({
        terserOptions: {
          mangle: false,
          keep_classnames: true,
          keep_fnames: true,
        },
      }),
    ],
  },

и, если это не работает, попробуйте настроить optimization.minimize на false

0 голосов
/ 15 января 2020

Используете ли вы модуль node-fetch ? fetch и AbortController не существует в нативном nodejs. Вам нужно будет использовать nodejs polyfill для каждого.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...