简短回答:
由Serverless Framework生成的AWS Lambda函数handler.js构建/生成将被放置在路径下:/var/task/src/handler.js
Lambda的默认运行目录(至少是Node8.10)为:/var/task
长回答:这是关于webpack包含JSON文件的问题。
我之前问了错误的问题来达到我想要的结果。我真正想知道的是:
如何告诉webpack在我使用Serverless Framework Lambda函数时包含一个json文件,以便lambda可以在运行时访问该json文件?
在你的存储库中,/src目录(可能是默认的Serverless项目结构)包含你的handler.js文件,并且是参考点(第一个从你的serverless项目复制进来的目录),没有任何上面的目录被复制进去。
话虽如此,假设你的本地文件/文件夹结构看起来像这样:
repo-root
——— src
——— ——— someFunction
——— ——— ——— some-sub-directory
重要的是要记住,无服务器 AWS Lambda 的文件结构(默认情况下)将如下所示:
——— src
——— ——— handler.js
——— node_modules
请注意,默认情况下,仅有您的handler.js文件,没有其他任何内容。
没有子目录,没有其他任何东西。这是因为尚未告诉webpack包含JSON文件(需要一些工作)。
通过'__dirname'正确设置Serverless 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配置中添加以下内容 - 在rules下(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中本地读取它。
故障排除(查找文件)
这里的关键是(如果您正在尝试将json文件包含/访问到类似于我的Serverless AWS Lambda函数),要意识到这实际上更多地涉及到webpack而不是Lambda路径设置问题。
因此,发现问题/找到文件的最佳方法就是构建您的函数,然后解压它创建的文件,看看您的json是否已经被正确地包含在其中。
一旦它已被包含——然后您可以使用上述设置和__dirname跟踪并实际利用该文件。
位于Serverless Lambda中的最终JSON文件位置
基于上述webpack配置,您的目录结构(在zip中)应如下所示:
——— src
——— ——— mypackedfiles
——— ——— ——— targetfile.json
——— ——— someFunction
——— ——— ——— some-sub-directory
——— node_modules
因此,考虑到这一点,你对webpack添加的json文件的引用现在应该是这样的:
let filelocation = __dirname + '/mypackedfiles/targetfile.json'
现在,您可以从
fs
或您想要的任何解析器中访问filelocation,因为它已经正确地包含在您的无服务器lambda中。
对于一个仓库内有多个函数的情况,请注意:使用此方法将把json文件复制到由您的仓库生成的每个函数中。这对于您可能是好事也可能不是好事,但对于我来说,它完全可行,因为我的JSON文件并不是特别大。
nodejs
。我使用Go
,并且注意到根文件是serverless.yml
所在的位置。例如,如果它在您的repo-root
中,则该文件将位于./src/someFunction/some-sub-directory/targetfile.json
。如果您想从 someFunction 调用该文件,则可以使用./some-sub-directory/targetFile.json
。那么,在您的serverless.yml
中,包含语句是什么样子的呢? - kkesley