我在另一个文件中有一个eventEmitter类(Logger),它将用uuid记录消息对象。我打算把那条消息写在一个文件里。
const Logger = require('./Logger')
const fs = require('fs')
const path = require('path')
// instantiate a new logger
const logger = new Logger()
logger.on('message', data => {
console.log('Called Listener:', data)
fs.appendFile(path.join(__dirname, '/logger', 'logger.txt'), `\n ${data}`, err => {
if (err) throw err
console.log('file written...')
})
})
logger.log('Hello there')//任何建议都可能有帮助
发布于 2021-07-02 00:19:25
虽然可以用console.log编写一个对象,但如果不对其进行字符串化,则无法将其添加到字符串中:
fs.appendFile(path.join(__dirname, '/logger', 'logger.txt'), `\n ${JSON.stringify(data)}`, err => {
if (err) throw err
console.log('file written...')
})当您试图向字符串中添加一个变量时,JS运行时会隐式地调用它的.toString()。这将导致对象的[object object]。
发布于 2021-07-02 00:24:30
您的记录器发出的是一个对象,而不是字符串。您可能需要更像${data.uuid} - ${data.log}的东西。
更重要的是,每次追加文件时,您都要从操作系统请求一个新的文件描述符,然后关闭它。这是低效的,你为自己创造了一个竞赛条件。如果你要做的事
for(let i=0;i<1000;i++)
logger.log(i.toString());您很难在文件中看到1000行。
你想要的更像是
const Logger = require('./Logger')
const fs = require('fs')
const path = require('path')
// instantiate a new logger
const logger = new Logger()
// Create write stream
const wstream = fs.createWriteStream(
path.join(__dirname, '/logger', 'logger.txt'),
{
flags: 'a', // append to file
autoClose: false // leave fd open for more writing after buffer empties
}
);
logger.on('message', data => {
console.log('Called Listener:', data)
wstream.write(`${data.uuid} - ${data.log}\n`);
})https://stackoverflow.com/questions/68218129
复制相似问题