简短的回答:
由无服务器框架生成/生成的 AWS Lambda 函数 handler.js 将放置在路径:/var/task/src/hander.js
Lambda(至少 Node8.10)的默认运行时目录是:
/var/task
长答案:这是关于包含 JSON 文件的 webpack。
为了达到我想要的结果,我真的问错了问题。我真正想知道的是:
如何告诉 webpack 在我的无服务器框架 Lambda 函数中包含一个 json 文件——以便 lambda 可以在运行时访问该 json 文件?
在您的存储库中,/src 目录(可能 - 如果您使用默认的无服务器项目结构)包含您的 handler.js 文件,并且是您的存储库中的参考点(从无服务器项目复制的第一个目录) - 高于此src 目录被复制进去。
也就是说,尝试假设您的本地文件/文件夹结构如下所示:
repo-root
——— src
——— ——— someFunction
——— ——— ——— some-sub-directory
请务必记住,无服务器 AWS Lambda 文件结构将如下所示(默认情况下):
——— src
——— ——— handler.js
——— node_modules
请注意,除了您的 handler.js 文件之外,没有其他内容(默认情况下)。
没有子目录,什么都没有。这是因为 webpack 没有被告知包含 JSON 文件(这需要一些工作)。
通过“__dirname”纠正无服务器 Lambda 绝对路径
首先需要从代码库中包含/要求/引用您的 json 文件。这让 webpack 知道你稍后会需要它:
let file = require('./some-sub-directory/targetfile.json');
如果您没有正确地要求 JSON 文件,那么您指向的位置将不会存在,这不会有什么不同。另一个更“hacky”的选项是将您的 JSON 文件重命名为 .js,然后通过相同的过程包含。
Webpack 文件加载器配置
仅包含 JSON 文件(在我的情况下)并不会触发 webpack 将文件实际包含在捆绑器中。我还需要添加 webpack 文件加载器:https ://www.npmjs.com/package/file-loader
然后将以下内容添加到我的 webpack 配置中——在规则下(对于 webpack 4 会略有不同):
{
// type: 'javascript/auto', // this would be for webpack 4
test: /\.json$/,
use: [
{
loader: 'file-loader',
options: {
name: "./src/mypackedfiles/[name].[ext]"
}
}
]
}
更多细节可以在这里找到:
https ://github.com/webpack/webpack/issues/6586#issuecomment-379448638
请记住,仅包含文件不会解析包含在该文件中的值——它只会告诉 webpack 包含它,以便您可以使用fs
或其他方法从 Lambda 本地读取它。
故障排除(查找文件)
这里的关键(如果您想像我一样尝试让无服务器 AWS Lambda 函数包含/可访问的 json 文件)是意识到这实际上更多是 webpack 的问题,而不是 Lambda 路径的问题。
因此,解决/查找文件的最佳方法就是构建您的函数,然后解压缩它创建的文件以查看您的 json 是否已正确包含。
一旦它被包含——那么你可以使用上面提到的带有 __dirname 的设置来追踪并实际使用该文件。
无服务器 Lambda 中的最终 JSON 文件位置
基于上述 webpack 配置,您的目录结构(在您的 zip 中)将如下所示:
——— src
——— ——— mypackedfiles
——— ——— ——— targetfile.json
——— ——— someFunction
——— ——— ——— some-sub-directory
——— node_modules
因此,考虑到这一点,您对 webpack 添加的 json 文件的引用现在看起来像这样:
let filelocation = __dirname + '/mypackedfiles/targetfile.json'
您现在可以从fs
或任何您想要的解析器访问文件位置,因为它已正确包含在您的无服务器 lambda 中。
一个 Repo 中的多个函数的注意事项:使用此方法,json 文件将被复制到您的 repo 生成的每个函数中。这对你来说可能是也可能不是一件好事,但它对我来说很好,因为我的 JSON 文件不是太大。