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无法读取nodejs中的文件传递路径变量
使用 lambda 部署时 fs.readFileSync 找不到文件