【问题标题】:NodeJS fs - Can't read external json file [duplicate]NodeJS fs - 无法读取外部json文件[重复]
【发布时间】:2025-12-28 22:30:17
【问题描述】:

我正在尝试使用 fs 读取外部 json 文件,然后记录它,但它不起作用。在我的 json 文件中,我只有一个数组要读取:

{
"tags": [ "blah", "blah1", "etc..."
        ]
}

我正在使用异步 readFile 函数来读取它

...
const tagsjson = require('../tags.json');
var tags;
...

 fs.readFile(tagsjson, 'utf8', function(err,data){
  if(err) throw err;

  tags = data;
})
 console.log(tags)

我不知道有什么问题,我试过 JSON.parse(data) 但它也不起作用,我使用的是原始数据,因为我想在阅读后将该标签发送给客户端。

【问题讨论】:

  • ...但它不起作用 什么不起作用?你有任何错误吗?还是因为readFile的异步调用有问题(因为console.log(tags)没有回调)?
  • 我正在使用 try catch 并将其记录在浏览器控制台中,Failed to load resource: the server responded with a status of 500 (Internal Server Error)
  • 文件名应该是例如一个字符串,const tagsjson = require('../tags.json'); 看起来有点不对。喜欢fs.readFile('../tags.json', 'utf8', (err, data) => { ...
  • 哦,它记录了这个The system cannot open the device or file specified让我试试你告诉我的

标签: arrays node.js json express fs


【解决方案1】:

当您使用异步文件读取时,您必须在回调函数中使用您的标签变量。您还必须在 readFile 函数中传递文件名:

异步:

var tags;
fs.readFile("../tags.json", 'utf8', function (err, data) {
   if (err) throw err;

   tags = data;
   console.log(tags);
});

同步:

var tags;
tags = fs.readFileSync("../tags.json", 'utf8');
console.log(tags);

【讨论】:

  • 如果我不能在回调函数之外使用标签,我将如何将其发送给客户端
  • 你可以把剩下的代码放在这个回调里面,你可以使用Promises确保文件被读取后执行剩下的代码
  • 或者你可以使用 readFileSync 函数来阻止代码的执行,并像你在代码中想要的那样使用你的标签 var
  • 在 Node.js 中推荐同步方法从来都不是一个好主意。如果在服务器上使用 如果有异步方法,则永远不要使用同步方法
  • 我知道并且我完全同意你的看法,但是它存在并且第一次,如果他不知道如何使用承诺,它可以成为一个解决方案
【解决方案2】:

你以错误的方式读取文件,这是错误

const tagsjson = require('../tags.json');

实际需要返回的内容将返回一个对象,而 readFile 函数的第一个参数是字符串

fs.readFile('../tags.json', 'utf8', function(err,data){
  if(err) throw err;

除了处理异步操作之外,您还需要处理两个选项

  • 回调
  • 承诺

为了承诺

const promise = new Promise((resolve, reject) => {
  fs.exists('../tags.json', (exists) => {
     if (exists) {
        fs.readFile('../tags.json', (err, data) => { 
          if(err) {
            console.log(err);
            reject(err);
            } else resolve(data);
         });
       } else {
         reject('File Does Not Exist!');
       }
   });
 });

promise
  .then(data => {
    console.log(data);
  })
  .catch(err => {
    console.log(err);
  });

【讨论】: