NodeJS 无法在Lambda函数中的模块外部使用import语句

kuhbmx9i  于 2022-11-03  发布在  Node.js
关注(0)|答案(4)|浏览(167)

我创建了一个lambda函数来获取dynamodb中存储的项目列表。然后我执行了npm run build命令,之后我得到了.js文件。我将dist内容与节点模块webpack.config.js和package.json沿着压缩并上传了它。当我尝试测试它时,我得到了以下错误。但据我检查,代码中没有错误。

{
  "errorType": "Runtime.UserCodeSyntaxError",
  "errorMessage": "SyntaxError: Cannot use import statement outside a module",
  "trace": [
    "Runtime.UserCodeSyntaxError: SyntaxError: Cannot use import statement outside a module",
    "    at _loadUserApp (/var/runtime/UserFunction.js:98:13)",
    "    at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
    "    at Object.<anonymous> (/var/runtime/index.js:43:30)",
    "    at Module._compile (internal/modules/cjs/loader.js:956:30)",
    "    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)",
    "    at Module.load (internal/modules/cjs/loader.js:812:32)",
    "    at Function.Module._load (internal/modules/cjs/loader.js:724:14)",
    "    at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)",
    "    at internal/main/run_main_module.js:17:11"
  ]
}
ki0zmccv

ki0zmccv1#

我有同样的错误与节点uuid模块。导入和使用它如下修复了我的问题:

'use strict';
const uuid = require('uuid');   // <-- how to import

exports.hello = async (event) => {
   // ...

   uniqueId = uuid.v4();  // <-- how to use it

   // ...
};
kmynzznz

kmynzznz2#

我可以使用require()很长一段时间,但是某些包,比如netlify,不能通过require()加载到lambda中。
但是AWS在2022年初改进了ES和commonJS的导入语句支持......参见here。遗憾的是没有很好地描述。
以下步骤可能并不完美,但对我很有效:
1.如果尚未切换到AWS功能上的NodeJs v14,请切换到该版本
1.打包你想再次使用的包,不要只有一个nodejs文件夹,还要有一个node 14文件夹。node 14文件夹在这里被提到,我认为是必不可少的。如果你忘记了如何创建lambda包,请遵循docs here
1.创建一个lib.mjs文件,并通过从/opt/nodejs/node 14/node_modules/[my-package]/[maybe-some-subfolder]/index. js导入来加载包。
1.您可以从lib.mjs导出所需的对象,然后从index.js加载它
lib.mjs:

// lib.mjs
import { NetlifyAPI } from "/opt/nodejs/node14/node_modules/netlify/src/index.js";
import { Route53Client } from "/opt/nodejs/node14/node_modules/@aws-sdk/client-route-53/dist-cjs/index.js";

export function loadPackages() {
    return { NetlifyAPI, Route53Client };
}

Index.js:

//index.js:
import { loadPackages } from './lib.mjs';

export async function handler(event) {
  const { NetlifyAPI, Route53Client } = loadPackages();
  //TODO: business logic
}

这花了我很长时间来研究,我的方法可能并不完美。我被迫找到一个加载netflify的解决方案,它只能通过导入语句工作。我很高兴在评论中得到反馈,我愿意相应地调整我的教程。

目前,如果可以的话,我还是建议你坚持使用require()。如果不行,我希望我能帮上忙。
PS:此方法不需要Webpack。

xzv2uavs

xzv2uavs3#

这可能有点晚了,但是我在导入模块时使用require而不是import修复了我的错误。

ovfsdjhp

ovfsdjhp4#

您的导入有问题。请检查您的代码(导入部分),并查看IDE是否检测到任何错误。对于我的情况,问题是:
import Jimp from 'jimp'
我把它改成了
import Jimp from 'jimp'
现在一切正常了。

相关问题