我正在尝试学习 Node.js。在自我练习期间将事件与服务器结合时,我遇到了一个奇怪的问题。
const {v4:uuid} = require('uuid');
const {format} = require('date-fns');
const Eventemit = require('events'); //Eventemit is a class
const os = require('os');
const path = require('path');
const fs = require('fs');
const http = require('http');
const user = os.userInfo().username;
const eventemitter = new Eventemit(); //eventemitter is an object of the class Eventemit
const server = http.createServer((req, res)=>{
const date_time = `${format(new Date, 'dd.MM.yyyy HH:mm:ss')}`
eventemitter.on('log', ()=>{
const req_string = `Log event: '${uuid()}' emitted by ${user} at time: ${date_time} hrs.\n`;
if(!fs.existsSync(path.join(__dirname, 'server_folder'))){
fs.mkdir(path.join(__dirname, 'server_folder'), (err)=>{
if(err){
console.error(err);
}
});
}
fs.appendFileSync(path.join(__dirname, 'server_folder', 'server_log.txt'), req_string, 'utf-8');
res.write(req_string);
res.end();
})
eventemitter.emit('log');
})
server.listen(5000);
当我在浏览器上刷新 localhost:5000 时,日志文本文件会在一次实例中多次注册它(请参阅随附的屏幕截图)。
请帮助我解决这个问题,提前致谢!
这是预期行为:您已使用
http.createServer()
在代码中创建了 HTTP 服务器。每次服务器收到请求时都会调用您传递给 createServer
的回调函数。
当您刷新浏览器时,它会向您的服务器发送一个新的 HTTP 请求,从而触发回调函数(并将日志信息写入控制台)。
您可以通过将其移到请求处理程序之外来避免它