【问题标题】:How do I write the result from res.json to a proper json file using node.js? [duplicate]如何使用 node.js 将 res.json 的结果写入正确的 json 文件? [复制]
【发布时间】:2017-09-05 23:11:24
【问题描述】:

这是代码 sn-p。查询以 json 形式返回,但如何将这些值写入 JSON 文件?

app.get('/users', function(req, res) {
    User.find({}, function(err, docs) {
        res.json(docs);

        console.error(err);
    })
});

【问题讨论】:

  • 你试过使用fs吗?

标签: javascript node.js


【解决方案1】:

使用节点的文件系统库“fs”。

const fs = require('fs');

const jsonData = { "Hello": "World" };
fs.writeFileSync('output.json', JSON.strigify(jsonData));

文档:fs.writeFileSync(file, data[, options])

【讨论】:

  • 这个答案不起作用,因为你不能直接将 JS 对象写入文件而不先对其进行字符串化。
  • 我已更新代码以使用 JSON.stringify() 传递 JSON 的字符串版本
【解决方案2】:

如果您要在路由回调处理程序中写入文件,您应该使用异步 writeFile() 函数或 fs.createWriteStream() 函数,它们是 Node.js 核心中 fs 模块的一部分应用程序接口。否则,您的服务器将无法响应任何后续请求,因为 Node.js 线程在写入文件系统时会阻塞。

这是一个在路由回调处理程序中使用 writeFile 的示例。每次调用路由时,此代码都会覆盖./docs.json 文件。

const fs = require('fs')
const filepath = './docs.json'

app.get('/users', (req, res) => {
    Users.find({}, (err, docs) => {
      if (err)
        return res.sendStatus(500)

      fs.writeFile(filepath, JSON.stringify(docs, null, 2), err => {
        if (err)
          return res.sendStatus(500)

        return res.json(docs)
      })
    })
})

以下是使用 Streams 将 JSON 写入文件的示例用法。 fs.createReadStream() 用于创建字符串化 docs 对象的可读流。然后将该 Readable 写入文件路径,并使用 Writable 流将 Readable 数据通过管道传输到其中。

const fs = require('fs')

app.get('/users', (req, res) => {
    Users.find({}, (err, docs) => {
      if (err)
        return res.sendStatus(500)

      let reader = fs.createReadStream(JSON.stringify(docs, null, 2))
      let writer = fs.createWriteStream(filename)

      reader.on('error', err => {
        // an error occurred while reading
        writer.end()  // explicitly close writer
        return res.sendStatus(500)
      })

      write.on('error', err => {
        // an error occurred writing
        return res.sendStatus(500)
      })

      write.on('close', () => {
        // writer is done writing the file contents, respond to requester
        return res.json(docs)
      })

      // pipe the data from reader to writer
      reader.pipe(writer)
    })
})

【讨论】:

  • 很想知道反对意见,因为这个答案没有任何问题。
  • 我没有投反对票,但我想知道可读流中的错误是否会触发文件写入器流的泄漏,正如here 解释的那样:“一个重要的警告是,如果可读流在处理过程中发出错误,Writable 目标不会自动关闭。如果发生错误,则需要手动关闭每个流以防止内存泄漏。"
  • @E_net4 添加了在读取过程中出现错误时显式关闭写入器的功能。
猜你喜欢
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2020-11-08
  • 2017-11-28
  • 2018-07-04
  • 2010-11-25
相关资源
最近更新 更多