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

Arm*_*man 49 node.js

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

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

const file = fs.readFileSync("../file.xml");
Run Code Online (Sandbox Code Playgroud)

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

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

为什么是这样?

如何避免重写fs.readFileSync中的路径?

car*_*ant 86

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

const path = require("path");
const file = fs.readFileSync(path.resolve(__dirname, "../file.xml"));
Run Code Online (Sandbox Code Playgroud)

  • 因为相对路径是使用当前目录解析的。您想使用其他目录来解决。从[docs](https://nodejs.org/api/fs.html):*“可以使用文件名的相对路径。但是请记住,该路径将相对于process.cwd()。 “ * (4认同)
  • 注意 - [`path`](https://nodejs.org/api/path.html) 是一个节点模块,提供用于处理文件和目录路径的实用程序。[`__dirname`](https://www.digitalocean.com/community/tutorials/nodejs-how-to-use__dirname) 是一个 Node.js 环境变量,指向当前文件的父目录。 (2认同)

Hal*_*991 17

为了扩展上面的内容,如果您将fs.readFileSyncTypeScript(当然还有 CommonJS)一起使用,语法如下:

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

const logo = fs.readFileSync(path.resolve(__dirname, './assets/img/logo.svg'));
Run Code Online (Sandbox Code Playgroud)

这是因为fs.readFileSync()相对于当前工作目录进行解析,请参阅Node.js 文件系统文档以获取更多信息。

来源:Node.js 的相对 fs.readFileSync 路径

当然,还有 CommonJS 格式:

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

const logo = fs.readFileSync(path.resolve(__dirname, './assets/img/logo.svg'));
Run Code Online (Sandbox Code Playgroud)