【问题标题】:AWS lambda SyntaxError: Unexpected token importAWS lambda SyntaxError:意外的令牌导入
【发布时间】:2019-02-20 20:07:43
【问题描述】:

我遵循了 serverless-stack.com 的指南,并在一个单一存储库中将我的 api 划分为多个服务。 代码使用 seed.run 部署得很好,但是当我尝试从我的 reactjs webclient 访问一些端点时,如果我的 api 出现错误。

我已尝试 console.log 记录该错误,但它并没有透露更多细节。我从 stackowerflow 的其他问题中猜想它可能与 ES6 或 babel 有关,但我不确定。

我的 .babelrc 看起来像这样:

{
  "plugins": ["source-map-support", "transform-runtime"],
  "presets": [
    ["env", { "node": "8.10" }],
    "stage-3"
  ]
}

我在 AWS (cloudwatch) 收到以下错误:

Syntax error in module 'list': SyntaxError
(function (exports, require, module, __filename, __dirname) { import * as dynamoDbLib from "./libs/dynamodb-lib";
^^^^^^

SyntaxError: Unexpected token import
at createScript (vm.js:80:10)
at Object.runInThisContext (vm.js:139:10)
at Module._compile (module.js:616:28)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18) . 

有什么我可能缺少的想法吗?

更新:

我的 babelrc:

{
  "presets": [
      [
          "env",
          {
              "targets": {
                  "node": "8.1"
              }
          }
      ]
  ]
}

我的 webpack.config.js

const nodeExternals = require("webpack-node-externals");

module.exports = {
  entry: slsw.lib.entries,
  target: "node",
  // Generate sourcemaps for proper error messages
  devtool: 'source-map',
  // Since 'aws-sdk' is not compatible with webpack,
  // we exclude all node dependencies
  externals: [nodeExternals()],
  mode: slsw.lib.webpack.isLocal ? "development" : "production",
  optimization: {
    // We no not want to minimize our code.
    minimize: false
  },
  performance: {
    // Turn off size warnings for entry points
    hints: false
  },
  // Run babel on all .js files and skip those in node_modules
  module: {
    rules: [
      {
        test: /\.js$/,
        loader: "babel-loader",
        include: __dirname,
        exclude: /node_modules/
      }
    ]
  }
};

包.json

{
  "name": "api",
  "version": "1.1.4",
  "description": "Backend API for APP.",
  "main": "handler.js",
  "scripts": {
    "test": "jest"
  },
  "devDependencies": {
    "@types/node": "^10.12.18",
    "body-parser": "^1.18.3",
    "nodemon": "^1.18.9",
    "aws-sdk": "^2.224.1",
    "babel-cli": "^6.26.0",
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-polyfill": "^6.26.0",
    "babel-preset-env": "^1.6.1",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-es2017": "^6.24.1",
    "babel-plugin-source-map-support": "^1.0.0",
    "babel-plugin-transform-runtime": "^6.23.0",
    "babel-preset-env": "^1.6.1",
    "babel-preset-stage-3": "^6.24.1",
    "jest": "^21.2.1",
    "serverless-offline": "^3.18.0",
    "serverless-webpack": "^5.1.0",
    "webpack": "^4.2.0",
    "webpack-node-externals": "^1.6.0"
  },
  "dependencies": {
    "babel-runtime": "^6.26.0",
    "source-map-support": "^0.4.18",
    "stripe": "^5.8.0",
    "uuid": "^3.2.1"
  }
}

【问题讨论】:

  • 尝试将modules: "commonjs" 选项传递给环境预设。这应该让您使用 ES6 模块并让它们在节点中工作。
  • 嗨,你能再指导我一些吗?我在哪里设置这个,在 package.json 中?
  • 喜欢这个? { "plugins": ["source-map-support", "transform-runtime"], "presets": [["env", { "node": "8.10", "modules": "commonjs"} ], “第 3 阶段”] }

标签: node.js aws-lambda aws-api-gateway serverless-framework aws-serverless


【解决方案1】:

导入语法在 Node v8.x.x 中不可用。使用 require 代替,或者使用 babel 编译它,就像 Bogdan Alexandru Militaru 所做的那样。

【讨论】:

    【解决方案2】:

    我成功地将我的代码部署到运行 Node 8.1 的 lambda 函数,使用 Babel 版本 6。我遇到了与您上面提到的完全相同的问题。我的解决方案:

    .babelrc文件

    {
        "presets": [
            [
                "env",
                {
                    "targets": {
                        "node": "8.1"
                    }
                }
            ]
        ]
    }
    

    来自package.json 的开发依赖项

      "devDependencies": {
        "@types/node": "^10.12.18",
        "body-parser": "^1.18.3",
        "express": "^4.16.4",
        "nodemon": "^1.18.9",
        "babel-cli": "^6.26.0",
        "babel-core": "^6.26.0",
        "babel-loader": "^7.1.2",
        "babel-polyfill": "^6.26.0",
        "babel-preset-env": "^1.6.1",
        "babel-preset-es2015": "^6.24.1",
        "babel-preset-es2017": "^6.24.1"
      },
    

    来自package.json 的脚本

        "clean": "rm -rf dist",
        "build": "npm run clean && babel ./lambda/custom/ -d dist && cp lambda/custom/package.json dist/",
        "start": "nodemon",
        "serveo": "ssh -R 80:localhost:3000 serveo.net",
        "deploy": "npm run build && ask deploy",
    

    【讨论】:

    • 嗨,不幸的是,这似乎对我不起作用。我已经用新的 babelrc、webpack 和 package.json 文件更新了我的帖子。
    • 我建议您简单地在本地构建并查看该代码的格式。 module 'list' 似乎有问题,可能是奇怪的导入。这很奇怪,因为您在 index.js 中从一开始就没有错误,或者您没有任何import * as XYZ from something?您可以尝试将未使用的导入放在那里仅用于测试吗?我可以和你一起看看你的代码,但我在你的个人资料中找不到任何联系信息。或者,如果您可以发布有关如何进行此导出的更多信息import * as dynamoDbLib from "./libs/dynamodb-lib"
    • 嗨。我如何在本地构建它?我只找到了一种调用本地函数的方法? serverless.com/framework/docs/providers/aws/cli-reference/… 我试图从 list.js 文件中删除我的导入,现在错误出现在下一行:export async function main(event, context) { 如果您可以通过 tstarkdk@gmail.com 联系我想联系我。
    • 你能不能看看我的github repo,我使用ask cli 进行部署,但这不是这里重要的部分。尝试输入命令"build": "babel ./PROJECT_PATH -d dist",这样您的项目将被编译到根目录下名为dist 的文件夹中。然后你可以看看你的代码。让我知道进展如何,如果没有,我们可以聊天。
    • 我使用种子部署到 AWS。我不太确定如何在 package.json 中使用 build 命令?我在 gitlab 有我的 repo,也许我可以邀请你参加,如果你那里有用户,你可以看到它?
    猜你喜欢
    • 2019-08-07
    • 2018-09-24
    • 2018-11-10
    • 1970-01-01
    • 2018-07-14
    相关资源
    最近更新 更多