Как вызвать module.exports из обработчика в AWS Lambda (Node.js) - PullRequest
0 голосов
/ 04 октября 2018

Вот что говорит в AWS:

Значение module-name.export в вашей функции.Например, «index.handler» вызывает export.handler в index.js.

И он правильно вызывает эту функцию:

exports.handler = (username, password) => {
    ...
}

Но что, если код такой:

module.exports = (username, password) => {
    ...
}

Как мне это назвать?Ничто из того, что я пробовал, не работает, как module.exports, module.handler и т. Д.

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

В моем aws lamda я использую вот так.

//index.js

const user = require('./user').user;
const handler = function (event, context, callback) {
  user.login(username, password)
    .then((success) => {
      //success
    })
    .catch(() => {
      //error
    });
};

exports.handler = handler;



//user.js
const user = {
  login(username, password) {
   return new BPromise((resolve, reject) => {
     //do what you want.
   });
  }
};
export {user};
0 голосов
/ 04 октября 2018

AWS Lambda ожидает, что ваш модуль экспортирует объект, содержащий функцию-обработчик.В вашей конфигурации Lambda вы затем объявляете файл, содержащий модуль, и имя функции-обработчика.

Способ экспорта модулей в Node.js - через свойство module.exports.Возвращаемое значение вызова require - это содержимое свойства module.exports в конце оценки файла.

exports - это просто локальная переменная, указывающая на module.exports.Вам следует избегать использования exports и использовать вместо него module.exports, поскольку некоторый другой фрагмент кода может перезаписать module.exports, что приведет к неожиданному поведению.

В первом примере кода модуль правильно экспортирует объектс одной функцией handler.Однако во втором примере кода ваш код экспортирует одну функцию.Поскольку это не соответствует API AWS Lambda, это не работает.

Рассмотрим следующие два файла: export_object.js и export_function.js:

// export_object.js

function internal_foo () {
    return 1;
}

module.exports.foo = internal_foo;

и

// export_function.js

function internal_foo () {
    return 1;
}

module.exports = internal_foo;

Когда мы запускаем require('export_object.js'), мы получаем объект с единственной функцией:

> const exp = require('./export_object.js')
undefined
> exp
{ foo: [Function: internal_foo] }

Сравните это с результатом, который мы получаем, когда запускаем require('export_function.js'), где мы просто получаем функцию:

> const exp = require('./export_funntion.js')
undefined
> exp
[Function: internal_foo]

Когда вы конфигурируете AWS Lambda для запуска функции с именем handler, которая экспортируется в модуль, определенный в файле index.js, вот примерное значение, которое Amazon выполняет при вызове функции:

const handler_module = require('index.js);
return handler_module.handler(event, context, callback);

Важной частью является вызов функции-обработчика, определенной в модуле.

0 голосов
/ 04 октября 2018

Вам нужно определить или экспортировать вашу функцию обработчика.

exports.handler = (username, password) => {
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...