使用 firebase 函数读取文件

Flo*_*n T 5 file firebase typescript google-cloud-platform google-cloud-functions

我有一个 Firebase 函数,想要读取一个存储在子文件夹中的 html 文件。

\n
\xe2\x94\x80\xe2\x94\x80 functions\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n    |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 index.ts // Here is the function\n    |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 html\n    |   |   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 template.html // the file I want to read\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试通过读取文件, const html = fs.readFileSync('./html/template.html');但它总是告诉我

\n
\n

错误:ENOENT:没有这样的文件或目录,打开 './html/template.html'\nat Object.openSync

\n
\n

我解决了 stackoverflow 上与这个主题相关的几乎所有问题,但没有任何效果对我有用。我还尝试将文件放在与函数相同的文件夹中,但它总是给我错误。

\n

我是否需要安装某些软件包或以某种方式导入文件才能访问它?

\n

nVi*_*ius 11

对于从搜索结果进入这篇文章的任何人......

解决这个问题的方法不是使用path.resolve.

这里的问题是,fs.readFileSync解析相对于process.cwd()(执行的目录节点)的路径。对于 firebase 函数,这将始终是为sourcein定义的目录firebase.json(默认情况下为functions目录)。
此功能记录在此处:
https ://nodejs.org/api/path.html#path_path_resolve_paths

如果在处理所有给定路径段后尚未生成绝对路径,则使用当前工作目录。

path.resolve具有相同的行为。它始终解析为绝对路径。如果您传入的路径不是绝对的,它会添加process.cwd()到它的前面。
节点文档中似乎没有记录这一点,但您可以在这里亲自查看: https: //github.com/nodejs/node/blob/029d1fd797975ef89b867f9d606257f0f070a462/lib/path.js#L1017

您可以通过两种方式解决这个问题:

  • 使用相对于函数根目录的路径(src/html/template.html在本例中)
  • 使用__dirnamepath.resolve(__dirname, './html/template.html')

__dirname是一个变量,它将始终返回当前正在执行的文件的目录的绝对路径。


Ren*_*nec 4

您需要使用该path.resolve()方法,该方法会将您的路径解析为绝对路径,然后再将其传递给该fs.readdirSync()方法。所以以下应该可以解决问题:

    const path = require('path');

    // ...

    let content = fs.readFileSync(
        path.resolve('./html/template.html')
    );
Run Code Online (Sandbox Code Playgroud)