我们正在使用 node.js 4.3
编写 AWS
lambda 函数,但我们遇到了一个奇怪的行为
并抛出错误。
首先:
'use strict';
exports.handler = function(event, context, callback) {
throw new Error();
};
这是像预期的那样抛出:
at exports.handler (/var/task/TestCode.js:4:11)
但是如果我们添加一个函数(即使是未调用的),它调用不同类/obj 的函数,其中包含带有 obj 的 lambda 表达式,我们会得到一个神秘的抛出信息。 为了使事情更容易理解,这里有一些代码:
'use strict';
function aRandomFunction() {
something.foo((obj) => {});
}
exports.handler = function(event, context, callback) {
throw new Error();
};
现在我们得到了一个我们不明白为什么的日志:
at something.foo.exports.handler (/var/task/TestCode.js:8:11)
有人能解释一下为什么会这样吗?这似乎是一些我不明白的 JS
魔法:)
谢谢
最佳答案
修改后的答案 - 升级到 v6.1
您的问题是 Node 版本 4.3。升级到 6.1 将解决该问题。
我重新创建了您提供的代码片段并在两个环境中运行了它。两种情况分别给出以下错误。
4.3
在 something.foo.module.exports.test (/var/task/handler.js:56:10)
- 意外的结果。
6.1
在 module.exports.test (/var/task/handler.js:56:10)
- 这将是抛出的预期结果。
原始答案 - polyfill
您的问题是错误消息中引用的行上的箭头函数...
'use strict';
function aRandomFunction() {
something.foo((obj) => {}); // illegal arrow function (ES6 not supported in Lambda environment by default)
}
exports.handler = function(event, context, callback) {
throw new Error();
};
没有 polyfill 的 Lambda Node 环境不支持 ES6 - 即使在传统 Node 环境中的 ^4.0 中也支持它。这是因为 AWS Lambda 没有使用完整和最新的 Node 引擎代码库。它最初是为较小的用例(例如 Alexa 技能集和单一函数调用)设计的,因此“额外”功能被砍掉了——大多数 ES6 都是受害者之一。
对于 polyfill,我推荐 babel。
解决方法:
安装相关的 babel 包。 (引用package.json)
将以下行添加到
handler.js
的顶部 - 应该执行 技巧。
'use strict';
if (!global._babelPolyfill) require('babel-polyfill'); // insert polyfill assignment
function aRandomFunction() {
something.foo((obj) => {});
}
exports.handler = function(event, context, callback) {
throw new Error();
};
// package.json (not a valid comment)
"dependencies": {
"babel-polyfill": "^6.23.0",
"babel-runtime": "^6.23.0",
},
"devDependencies": {
"babel-core": "^6.24.1",
"babel-loader": "^7.0.0",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-preset-es2015": "^6.24.1",
"babel-preset-es2016": "^6.24.1",
"babel-preset-stage-0": "^6.24.1",
"json-loader": "^0.5.4",
"serverless-webpack": "^1.0.0-rc.4",
"webpack": "^2.4.1",
"webpack-node-externals": "^1.6.0"
}
如果您使用的是 Serverless 这样的框架,那么这里是 webpack.config.js
和 serverless.yml
// webpack.config.js
const nodeExternals = require('webpack-node-externals');
module.exports = {
entry: './handler.js',
target: 'node',
module: {
loaders: [{
test: /\.jsx?$/,
loader: 'babel-loader', // add babel-loader
include: __dirname,
exclude: /node_modules/,
}, {
test: /\.json$/,
loader: 'json-loader',
}],
},
externals: [nodeExternals()],
};
# serverless.yml
service: myApp
package:
exclude:
provider:
name: aws
runtime: nodejs4.3
stage: development
region: ap-northeast-1
plugins:
- serverless-webpack
custom:
webpackIncludeModules: true
main:
babelOptions: # include babel options
presets: [es2015, es2016, stage-0]
plugins: [transform-runtime]
functions:
main:
handler: handler.main
memorySize: 1024
timeout: 10
events:
- http:
关于javascript - AWS Lambda [Node.js 4.3] - 奇怪的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46078215/