【问题标题】:Writing to a file in Node.JS inside an async function在异步函数中写入 Node.JS 中的文件
【发布时间】:2021-09-10 08:48:25
【问题描述】:

我正在写入异步函数内的文件:

let Parser = require('rss-parser');
const fs = require('fs')

function parse(feed_url) {
    let parser = new Parser();
    (async () => {
        let feed = await parser.parseURL(feed_url);
        fs.writeFileSync('./output.json', JSON.stringify(feed), {
            encoding: "utf8",
            mode: 0o666
          })
    })();
    const data = fs.readFileSync('./output.json', 'utf8')
    fs.unlinkSync('./output.json');
    return data
}

console.log(parse('https://www.reddit.com/.rss'))

我现在得到错误:

Error: ENOENT: no such file or directory, open './output.json'

如果想知道,我确实需要在异步函数中写入文件,因为我正在使用一个包。

如何在异步函数内写入文件,然后在异步函数外读取该文件?

更新:添加完整代码。

【问题讨论】:

  • 可能文件还没有被写入...显示代码,包括你何时/如何阅读它
  • 顺便说一句,为什么是 IIFE async 呢?你没有在等待任何东西,也没有使用任何异步的东西,事实上,你专门使用同步写入......如果你不使用async,你的代码可能会工作
  • 您不需要将fs.writeFileSync() 放入async 函数中。这是一个完全同步的操作。而且,为了帮助您解决文件不存在的问题,我们需要查看其余的相关代码,包括尝试读取文件的代码以及与该代码相关的运行方式。这可能是时间问题,也可能是当前工作目录已更改,或者可能是其他东西删除了文件,或者可能是权限问题。目前,您的问题没有足够的信息来提供进一步帮助。
  • @JaromandaX 我有更多的代码,它确实使用了asyncawait,用于解析RSS 提要,我简化了代码以便更容易理解。你可以查看我正在使用的包@npmjs.com/package/rss-parser
  • 我不明白为什么你首先需要一个文件

标签: javascript node.js asynchronous fs


【解决方案1】:

使函数解析异步

那么你的代码很简单

async function parse(feed_url) {
    let parser = new Parser();
    let feed = await parser.parseURL(feed_url);
    fs.writeFileSync('./output.json', JSON.stringify(feed), {
        encoding: "utf8",
        mode: 0o666
      })
    const data = fs.readFileSync('./output.json', 'utf8')
    fs.unlinkSync('./output.json');
    return data
}

parse('https://www.reddit.com/.rss').then(console.log);

当然……你为什么需要一个文件!!!!

async function parse(feed_url) {
    let parser = new Parser();
    let feed = await parser.parseURL(feed_url);
    return JSON.stringify(feed)
}

parse('https://www.reddit.com/.rss').then(console.log);

【讨论】:

  • 这让你想知道他们是否应该使用fs.promises.writeFile()fs.promises.readFile()
  • @jfriend00 - 我已经不再想这些事情了:p
【解决方案2】:
  1. 我认为你的文件路径应该是"output.json"(根据node.js的文档)。

  2. 由于您没有在代码中使用 await 关键字,您也可以将其删除。

(() => {
        data = {
           value: 'value'
           value_2: 'value'
        }
        fs.writeFileSync('output.txt', JSON.stringify(data), {
            encoding: "utf8",
            mode: 0o666
        })
})();

【讨论】:

  • 欢迎来到 StackOverflow。能否请您对齐代码(output.txt)和描述(output.json)?
  • 如问题中所述,我使用外部库 rss-parser 解析 rss 提要,并将其导出到文件中。因此,我需要使用异步,所以这对问题不起作用。
猜你喜欢
  • 1970-01-01
  • 2019-01-20
  • 2019-07-04
  • 2011-02-06
  • 1970-01-01
  • 2012-08-31
  • 2017-12-25
  • 2016-08-17
  • 1970-01-01
相关资源
最近更新 更多