使用 lambda 部署时 fs.readFileSync 找不到文件
Posted
技术标签:
【中文标题】使用 lambda 部署时 fs.readFileSync 找不到文件【英文标题】:fs.readFileSync cannot find file when deploying with lambda 【发布时间】:2018-07-14 23:51:57 【问题描述】:在我的代码中,我从我的 lambda 函数调用查询
let featured_json_data = JSON.parse(fs.readFileSync('data/jsons/featured.json'))
这在本地有效,因为我的 features.json 位于我正在读取的目录中。但是,当我使用无服务器部署时,它生成的 zip 没有这些文件,我得到一个
ENOENT: no such file directory, open...
我尝试通过添加包装
package:
include:
- data/jsons/featured.json
但它只是不起作用。我让它工作的唯一方法是手动添加 json 文件,然后将我编译的 handler.js 代码更改为从根目录中的 json 文件中读取。
在这个屏幕截图中,我必须添加 json,然后再次手动上传,并在编译的 handler.js 代码中更改目录以排除数据/json
我想在我的 servereless.yml 中实际处理这个
【问题讨论】:
【参考方案1】:您可以使用require()
加载 JSON 文件。
const featured_json_data = require('./featured.json')
或者更好的是,将您的 JSON 转换为 JS!
【讨论】:
谢谢,让我测试一下。澄清一下,我必须指定 json 文件的路径还是需要知道在哪里可以找到它?require
要求您以与require
JS 文件相同的方式提供 JSON 文件的相对路径。
非常感谢它的工作!没有意识到我的其余 javascript 文件是如何被发现的,并且可以将其应用于 json 文件。【参考方案2】:
对于处理非 JSON 文件,我发现 process.cwd()
在大多数情况下都适合我。例如:
const fs = require('fs');
const path = require('path');
export default async (event, context, callback) =>
try
console.log('cwd path', process.cwd());
const html = fs.readFileSync(
path.resolve(process.cwd(), './html/index.html'),
'utf-8'
);
const response =
statusCode: 200,
headers:
'Content-Type': 'text/html'
,
body: html
;
callback(null, response);
catch (err)
console.log(err);
;
【讨论】:
【参考方案3】:我建议查看copy-webpack-plugin
:https://github.com/webpack-contrib/copy-webpack-plugin
您可以使用它来打包其他文件以包含在您的 Lambda 部署中。
在我的项目中,我在 /templates 目录中有一堆文件。在 webpack.config.js 中打包这些模板,对我来说它看起来像:
const CopyWebpackPlugin = require('copy-webpack-plugin');
module.exports =
plugins: [
new CopyWebpackPlugin([
'./templates/*'
])
]
;
【讨论】:
【参考方案4】:使用 lambda 部署时 fs.readFileSync 找不到文件
查看当前目录,查看部署环境中的目标目录内容。将用于该检查的适当代码添加到您的程序/脚本中。
【讨论】:
你能看看我更新的截图吗?问题是当我使用 servereless 部署时,它不包含我的目录,它会压缩 handler.js 中的所有 js 文件,并且由于我的 json 文件是静态的,因此我必须手动添加它们并将它们压缩回去。我希望能够将它们包含在我的部署中。 谢谢加你!以上是关于使用 lambda 部署时 fs.readFileSync 找不到文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 require vs fs.readFile 读取 json 文件内容
Node.JS:fs.readFile 在 Ubuntu 上不起作用