fs.readFileSync 不是文件相关的?节点.js

Posted

技术标签:

【中文标题】fs.readFileSync 不是文件相关的?节点.js【英文标题】:fs.readFileSync is not file relative? Node.js 【发布时间】:2017-11-19 22:06:57 【问题描述】:

-假设我的项目根目录中有一个名为file.xml 的文件。

-假设我在 tests/ 中有一个名为“test.js”的测试文件,它有

const file = fs.readFileSync("../file.xml");

如果我现在从项目的根目录运行node ./tests/test.js,它会说../file.xml 不存在。如果我在测试目录中运行相同的命令,那么它可以工作。

似乎fs.readFileSync 与调用脚本的目录相关,而不是脚本实际所在的目录。如果我在test.js 中写了fs.readFileSync("./file.xml"),它看起来会更加混乱,并且与require 语句中的相对路径不一致,后者是文件相关的。

这是为什么?如何避免重写 fs.readFileSync 中的路径?

【问题讨论】:

__dirname 不一定与当前工作目录相同,但fs.readFileSync() 使用当前工作目录。当前工作目录可能设置为您启动节点时的任何内容。 【参考方案1】:

您可以使用path.resolve 解析相对于源文件位置的路径(而不是当前目录):

const path = require("path");
const file = fs.readFileSync(path.resolve(__dirname, "../file.xml"));

【讨论】:

谢谢。这行得通,我很想接受它,但是知道为什么需要这样做吗?我希望能够向我团队中的开发人员解释为什么需要额外的步骤,因为它在 require 语句中不是必需的。例如:如果我在根目录中有一个名为 module.js 的模块,我只需要在 test.js 中执行 require("../module.js") 因为相对路径是使用当前目录解析的。并且您想使用不同的目录进行解析。来自docs:“可以使用文件名的相对路径。但是请记住,此路径将相对于 process.cwd()。” 出于某种原因,我想到了因为本地文件无法在我的远程环境中运行。需要通过完整的 url 获取文件。但是,我当然没有,我可以使用这种方法来解析远程服务器上的绝对路径.. 注意 - path 是一个节点模块,它提供了用于处理文件和目录路径的实用程序。 __dirname 是 node.js 环境变量,指向当前文件的父目录。 我将添加以查看 cosole ......也许缺少一些“../”。它就像一个魅力!【参考方案2】:

只是为了扩展上述内容,如果您使用 fs.readFileSync 和 TypeScript(当然还有 CommonJS),语法如下:

import fs from 'fs';
import path from 'path';

const logo = fs.readFileSync(path.resolve(__dirname, './assets/img/logo.svg'));

这是因为fs.readFileSync() 是相对于当前工作目录进行解析的,有关详细信息,请参阅Node.js File System 文档。

来源:Relative fs.readFileSync paths with Node.js

当然还有 CommonJS 格式:

const fs = require('fs');
const path = require('path');

const logo = fs.readFileSync(path.resolve(__dirname, './assets/img/logo.svg'));

【讨论】:

不确定我看到这如何扩展接受的答案,对我来说似乎完全一样 - path.resolve__dirname 和相对路径。 @404 是的,我是为 TypeScript 人提供的 :) 代码是一样的,但是使用了 import 语句。

以上是关于fs.readFileSync 不是文件相关的?节点.js的主要内容,如果未能解决你的问题,请参考以下文章

节点 fs.readFileSync 返回一个 uInt8 数组而不是原始缓冲区数组?

如何为 fs.readFileSync() 捕获没有文件?

fs.readFileSync无法读取nodejs中的文件传递路径变量

使用 lambda 部署时 fs.readFileSync 找不到文件

为啥 fs.readFileSync 不会检测到我的 json 文件

fs.readFileSync 总是返回空字符串