我们正在用AWS编写node.js 4.3 lambda函数,但由于抛出错误而使一个奇怪的behaviour陷入困境。

第一:



'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

您的问题是节点版本4.3。升级到6.1将解决此问题。

我重新创建了您提供的代码片段,并在两种环境中都运行了它。两种情况分别给出以下错误。


4.3


at something.foo.module.exports.test (/var/task/handler.js:56:10)
意外的结果。

6.1


at 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节点环境不支持ES6-即使在传统节点环境的^ 4.0中也支持ES6。这是由于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.jsserverless.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:

07-24 09:38
查看更多