使用 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 上不起作用

fs.readFile() 返回未定义 [重复]

fs 库:使用时出错

在 Node 中使用 fs.readFile 串行读取文件?

node.js 中 fs.createReadStream 与 fs.readFile 的优缺点是啥?