当我的代码中没有语法错误时,为什么会出现 UserCodeSyntaxError?

Why do I get a UserCodeSyntaxError when I have no syntax error in my code?

我目前正在 nodejs 中创建一个 Dialogflow 聊天机器人,在部署我的代码时我收到一条错误消息。我试图取消注释大多数事情,只留下基本功能代码,但我仍然无法让它工作。我不确定这里的问题是什么

'use strict';
  import {getAPIresponse} from "./api/index.js";

// const http = require('https');

// const respond = fulfillmentText => {
//   return {
//     statusCode: 200,
//     body: JSON.stringify({
//       fulfillmentText
//     }),
//     headers: {
//       "Content-Type": "application/json"
//     }
//   }
//
// };

module.exports.dining = async (event,context) => {


    const incoming= JSON.parse(event.body).queryResult;

    console.log(`INCOMING: ${incoming.parameters.hall}`);

    const {
      displayName
    } = incoming.intent;

    console.log(displayName);


    //const menu = getAPIresponse('https://esb.prod.uds.harvard.edu/api/dining/2.0/','events?locationId=36');
    //console.log(menu);
    // if(displayName === 'dining'){
    //   if(incoming.parameters.meal === 'breakfast'){
    //     //get's dining hall code to include in API request
    //     const hall = getCode(incoming.parameters.hall);
    //     //generate response from API based off of parameters passed by user
    //     const menu = getAPIresponse("https://esb.prod.uds.harvard.edu/api/dining/2.0/","events?locationId=${hall}", hall);
    //     console.log(menu);
    //   }
    //   if(incoming.parameters.meal === 'lunch'){
    //     //get's dining hall code to include in API request
    //     const hall = getCode(incoming.parameters.hall);
    //     //generate response from API based off of parameters passed by user
    //     const menu = getAPIresponse("https://esb.prod.uds.harvard.edu/api/dining/2.0","/events", hall);
    //   }
    //   if(incoming.parameters.meal === 'dinner'){
    //     //get's dining hall code to include in API request
    //     const hall = getCode(incoming.parameters.hall);
    //     //generate response from API based off of parameters passed by user
    //     const menu = getAPIresponse("https://esb.prod.uds.harvard.edu/api/dining/2.0","/events", hall);
    //   }
    // }
};

几乎所有内容都被注释掉了,但我仍然收到显示

的错误消息
2019-07-02 16:31:33.351 (-04:00)        undefined       ERROR   Uncaught Exception  {
"errorType":"Runtime.UserCodeSyntaxError","errorMessage":"SyntaxError: Unexpected tok
en {","stack":["Runtime.UserCodeSyntaxError: SyntaxError: Unexpected token {","    at
 _loadUserApp (/var/runtime/UserFunction.js:98:13)","    at Object.module.exports.loa
d (/var/runtime/UserFunction.js:140:17)","    at Object.<anonymous> (/var/runtime/ind
ex.js:36:30)","    at Module._compile (internal/modules/cjs/loader.js:701:30)","    a
t Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)","    at Modu
le.load (internal/modules/cjs/loader.js:600:32)","    at tryModuleLoad (internal/modu
les/cjs/loader.js:539:12)","    at Function.Module._load (internal/modules/cjs/loader
.js:531:3)","    at Function.Module.runMain (internal/modules/cjs/loader.js:754:12)",
"    at startup (internal/bootstrap/node.js:283:19)"]}

AWS Lambda 不支持您在此处编写的 ES6 import 说明符

import {getAPIresponse} from "./api/index.js";

因为 Node.js 默认不支持 ES6 import 语法(注意:我的 lambda 运行时设置为 Node.js 10.x)。


插图:

在我的 lambda 发行版的 index.js 文件顶部导入库时,我也遇到了这个问题。

当我使用 import 语法时,堆栈跟踪 Uncaught Exception { "errorType":"Runtime.UserCodeSyntaxError", ... unexpected token import found ... blabla... } ... 被抛入我的 lambda 函数中:

import awsServerlessExpress from 'aws-serverless-express';

exports.handler = (event, context) => {
  console.log('hello world!')
};

但在我刚刚使用标准模块 require 语法时,在下面的这个版本中没有。

const awsServerlessExpress = require('aws-serverless-express');

exports.handler = (event, context) => {
  console.log('hello world!')
};

对我来说,是 import 语法导致 SyntaxError 异常,但请注意,对您来说,您当前的 JavaScript 语法不支持=59=]运行时会抛出这个异常。


几个解决方案:

  1. 将所有 import 语句更改为标准模块 require 语句,并继续使用您配置的 Node.js 运行时支持的任何默认 JavaScript 风格。

  2. 在部署到云之前,使用像 Babel 和 Webpack 这样的编译器来编译你的 ES6 JavaScript。

  3. 使用下面 Yitzchak 很好地描述的快速解决方案 :) 只需在您的 Lambda 仪表板上修改 NodeJS 版本即可。

对我有用:更新 Node.js 版本的 lambda

我收到此错误是因为 lambda 被定义为使用 Node.js 12.x 执行,当我将其更改为 Node.js 14.x(就像在我的本地机器上一样)有效

如果它有效 - 并且您通常使用 serverless 包来自动部署您的 lambda - 不要忘记更新您的 serverless.yml 相应地归档

有时在 lambda 中,当我们点击 Deploy 时,所有更改都没有部署。刷新页面并检查语法错误。 或者至少这就是我的问题所在。

就我而言,我粘贴了另一个节点版本为 14 的 lambda 的代码。 但是我当前的 lambda 节点版本是 12。 我粘贴的代码在一行中使用了可选链接 (?.)。删除它,部署代码,它工作正常。

如果您使用 TypeScript 并遇到此错误,请确保您在 tsconfig.json 中设置的目标与您的目标 nodejs 版本相匹配。有关推荐设置的列表,请访问 Node Target Mapping

例如,我的目标是 node.js 12 并使用 ES2020。将其更改为 ES2019 解决了我的问题。