如果您要在路由回调处理程序中写入文件,您应该使用异步 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)
})
})