如何从AWS Lambda(Node.js)的处理程序中调用module.exports

时间:2018-10-04 04:59:02

标签: node.js aws-lambda

AWS就是这样:

  

函数中的module-name.export值。例如,   “ index.handler”在index.js中调用exports.handler。

它正确调用了此函数:

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

但是如果代码是这样的话:

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

我怎么称呼它?我没有尝试过像module.exportsmodule.handler等这样的作品。

4 个答案:

答案 0 :(得分:2)

AWS Lambda希望您的模块导出包含处理程序功能的对象。然后,在Lambda配置中,声明包含模块的文件以及处理程序函数的名称。

在Node.js中导出模块的方式是通过module.exports属性。 require调用的返回值是文件评估结束时module.exports属性的内容。

exports只是指向module.exports的局部变量。您应该避免使用exports,而应使用module.exports,因为其他一些代码可能会覆盖module.exports,从而导致意外的行为。

在您的第一个代码示例中,模块使用单个函数handler正确导出对象。但是,在第二个代码示例中,您的代码导出了一个函数。由于这与AWS Lambda的API不匹配,因此不起作用。

请考虑以下两个文件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中定义的模块中导出,这是亚马逊在调用此功能时的近似方法:

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

重要的部分是对模块中定义的处理程序函数的调用。

答案 1 :(得分:0)

您需要定义或导出处理程序函数。

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

答案 2 :(得分:0)

在我的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};

答案 3 :(得分:0)

如果您尝试使用具有Amazon技能的打字稿并遇到此问题,则很可能是您的事件处理程序正在编译到子文件夹而不是在主目录中。

默认情况下,AWS在lambda文件夹的根目录中查找事件处理程序。但是,如果使用打字稿并将输出编译到build文件夹中,则需要更改AWS寻找处理程序的位置。从以下位置修改技能的根目录中的ask-resources.json

// ...
"skillInfrastructure": {
    "userConfig": {
        "runtime": "nodejs10.x",
        "handler": "index.handler",
        "awsRegion": "us-east-1"
    },
    "type": "@ask-cli/lambda-deployer"
}
// ...

// ...
"skillInfrastructure": {
    "userConfig": {
        "runtime": "nodejs10.x",
        "handler": "build/index.handler",
        "awsRegion": "us-east-1"
    },
    "type": "@ask-cli/lambda-deployer"
}
// ...