fs.readFileSync不是文件相关的吗?Node.js

fs.readFileSync不是文件相关的吗?Node.js,node.js,path,Node.js,Path,-假设我在项目的根目录下有一个名为file.xml的文件 -假设我在tests/中有一个名为“test.js”的测试文件,它有 const file = fs.readFileSync("../file.xml"); 如果我现在从项目的根目录运行节点./tests/test.js,它会说。/file.xml不存在。如果我在tests目录中运行相同的命令,那么它会工作 似乎fs.readFileSync是相对于调用脚本的目录,而不是脚本实际所在的目录。如果我在test.js中

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

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

const file = fs.readFileSync("../file.xml");
如果我现在从项目的根目录运行
节点./tests/test.js
,它会说
。/file.xml
不存在。如果我在tests目录中运行相同的命令,那么它会工作

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


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

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


为了扩展以上内容,如果您使用with(当然还有CommonJS),以下是语法:

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

const logo = fs.readFileSync(path.resolve(__dirname, './assets/img/logo.svg'));
这是因为相对于当前工作目录解析了
fs.readFileSync()
,有关详细信息,请参阅文档

资料来源:

当然,还有CommonJS格式:

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

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

非常感谢。这是可行的,我很想接受它,但你知道为什么需要这样做吗?我希望能够向我的团队中的开发人员解释为什么需要额外的步骤,因为在require声明中它是不必要的。例如:如果我在根目录中有一个名为module.js的模块,我只需要在test.js中执行require(../module.js”),因为相对路径是使用当前目录解析的。您希望使用不同的目录进行解析。来自:“可以使用文件名的相对路径。但是,请记住,此路径将与process.cwd()相对。”出于某种原因,我突然想到,因为本地文件在我的远程环境中不起作用,所以我选择了。需要通过完整的url获取文件。但是,我当然没有,并且我能够使用此方法解析远程服务器上的绝对路径..注意-是一个节点模块,提供用于处理文件和目录路径的实用程序。是一个node.js环境变量,它指向当前文件的父目录。。。也许有一些“./”不见了。它就像一个符咒
\uu dirname
不一定与当前工作目录相同,但
fs.readFileSync()
使用当前工作目录。当前工作目录很可能设置为启动节点时的任何目录。我不确定这是如何扩展接受的答案的,它在我看来似乎完全相同-
路径。使用
\uu dirname
和相对路径解析
。@404是的,我包括了TypeScript人员:)代码是相同的,但使用了导入语句。
const fs = require('fs');
const path = require('path');

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