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);
Важной частью является вызов функции-обработчика, определенной в модуле.