关于javascript:如何使用node.js将res.json的结果写入正确的json文件?

How do I write the result from res.json to a proper json file using node.js?

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
app.get('/users', function(req, res) {
    User.find({}, function(err, docs) {
        res.json(docs);

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


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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)
      })
    })
})

下面是将JSON写入带有流的文件的示例用法。fs.createReadStream()用于创建字符串化docs对象的可读流。然后,通过一个可写流将可读数据导入文件路径,将可读数据写入文件路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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)
    })
})


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

1
2
3
4
const fs = require('fs');

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

docs:fs.writefilesync(文件,数据[,选项])