javascript - AWS Lambda [Node.js 4.3] - 奇怪的堆栈跟踪

标签 javascript node.js amazon-web-services lambda

我们正在使用 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。

解决方法:

  1. 安装相关的 babel 包。 (引用package.json)

  2. 将以下行添加到 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:

关于javascript - AWS Lambda [Node.js 4.3] - 奇怪的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46078215/

相关文章:

javascript - 使用 Intl.NumberFormat 有条件地删除格式化货币值上的小数

node.js - 在 Chromium 中传递 "Your connection is not private"页面

sql-server - 将 XML 传递给 Node 中的存储过程

amazon-web-services - AWS Kinesis Firehose 到 ElasticSearch 地理数据映射

javascript - 如何以编程方式将 QuillJS 格式设置设置为 "normal"或 "default"值?

javascript - Firebase 云 FireStore : Insert Large Array

node.js - NodeJS 不会提供静态文件,即使使用 express.static

php - 如何找到我的 php-fpm.sock?

amazon-web-services - AWS-CLI : Create RDS Aurora DB instance into existing cluster created from snapshot

javascript - Gulp 在 Windows 上运行失败 |错误消息 : Microsoft JScript compilation error, 无效字符