Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是fs.watch()在节点v13中损坏了,还是我做错了什么?_Javascript_Node.js_Express_Fs_Winston - Fatal编程技术网

Javascript 是fs.watch()在节点v13中损坏了,还是我做错了什么?

Javascript 是fs.watch()在节点v13中损坏了,还是我做错了什么?,javascript,node.js,express,fs,winston,Javascript,Node.js,Express,Fs,Winston,我一直在尝试设置一个文件监视程序,该程序可以在文件中添加新数据时进行检测。一般顺序为1。)客户端连接到服务器。2.)服务器将日志记录到文件。3.fs.watch()检测文件已更改并运行一个函数,在本例中是一个简单的console.log('New log entry') 除了在日志文件中添加新消息时,fs.watch()没有检测到外,其他一切似乎都正常。但是,如果我在VScode中单击日志文件,它似乎会触发它。这是Node较新版本中的错误还是我在这里做错了什么 我意识到我可以使用fs.watch

我一直在尝试设置一个文件监视程序,该程序可以在文件中添加新数据时进行检测。一般顺序为1。)客户端连接到服务器。2.)服务器将日志记录到文件。3.
fs.watch()
检测文件已更改并运行一个函数,在本例中是一个简单的
console.log('New log entry')

除了在日志文件中添加新消息时,
fs.watch()
没有检测到外,其他一切似乎都正常。但是,如果我在VScode中单击日志文件,它似乎会触发它。这是Node较新版本中的错误还是我在这里做错了什么

我意识到我可以使用
fs.watchFile()
,但我希望避免轮询的开销

// src/index.js
const path = require('path');
const express = require('express');
const app = express();
const server = require('http').createServer(app);
const io = require('socket.io')(server);
const logger = require('./logger');
const fs = require('fs');

fs.watch('./logs/combined.log', (event) => {
  if (event === 'change') {
    console.log('New log entry');
  }
});

app.use(express.static(path.join(__dirname, '../public')));
app.get('/', function(req, res, next) {
  res.sendFile(path.join(__dirname, '../public', 'index.html'));
});

io.on('connection', function(socket) {
  logger.info('a user connected');
});

const PORT = process.env.PORT || 8888;

server.listen(PORT, () => {
  logger.info(`Listening at http://localhost:${port}`);
});
-

-


的节点文档有一整节,从一开始就说明:

fs.watch API在不同平台之间并非100%一致,而是 在某些情况下不可用

您应该阅读该部分以了解更多信息,但如果您无法获得
fs.watch
,则可能最终不得不使用

[更新]

“注意事项”一节的小节还规定:

即使在受支持的平台上,
文件名
也不一定总是可以使用 假如因此,不要假设
filename
参数总是 在回调中提供,如果为
null
,则具有一些回退逻辑

由于您不需要使用
filename
参数(而且您已经知道文件名),因此回调不应该测试真实的
filename
参数。

更新:

就这样。这些侦听器的行为类似于文件监视程序,并允许您钩住某些事件。您可以钩住的事件之一称为“数据”——这使您可以侦听数据写入文件的时间,并运行回调函数

这提供了与
file.watch类似的行为

它们允许您监听以下事件:

  • 接近
  • 资料
  • 结束
  • 错误
  • 可读的
我在Windows上进行了测试,效果非常好

这是我正在使用的测试文件:

const winston=require('winston');
const{createLogger,格式:{json},传输:{File}}=winston;
const logger=createLogger({
级别:“信息”,
格式:json(),
运输:[
新文件({filename:'./log.txt'})
],  
});
/**
*添加了一个内置Winston侦听器
*/
logger.addListener('data',chunk=>{
console.log('\r\n[winston listener]我们已经记录了一些数据:\n',chunk)
})
/**
*他们的文档似乎使用了“.on”方法。
* 
*这似乎提供了与“.addListener”相同的行为类型。
* 
*我不确定哪一个是最好的,或者推荐的,`.addListener`或者`.on`-you
*我可能想更深入地了解这一点。
*/
logger.on('data',chunk=>{
log('\r\n[winston“data”]我们记录了一些数据:\n',chunk);
});
设置间隔(()=>{
logger.info(“新日志消息”);
}, 5000);

所以我一直在思考这个问题,起初我认为这是因为Winston使用写流来更新文件

然后我继续尝试复制你的问题,但我无法复制它

每次更新日志文件时,都会向控制台写入一条消息(这意味着,
fs.watch
正在工作

您正在使用Windows吗?您使用的是哪个版本的Node

这是我正在使用的测试文件:

const winston=require('winston');
常数fs=要求('fs');
const{createLogger,格式:{json},传输:{File}}=winston;
const logger=createLogger({
级别:“信息”,
格式:json(),
运输:[
新文件({filename:'./log.txt'})
]
});
fs.watch('./log.txt',event=>{
如果(事件=='change'){
log(“日志文件已更新”);
}
});
设置间隔(()=>{
logger.info(“新日志消息”);
}, 5000);

如果你想要简单一致的东西,你应该检查一下它被微软的Visual Studio code、gulp、karma、PM2、browserify、webpack、BrowserSync等使用过。看起来你甚至可以从你的主应用程序中启动子进程……我想知道这个套接字是否有问题?我在Mac上测试过。很好,我会检查的我还在原来的帖子中添加了一个简化的测试,你可以试着看看是否有问题?我仍然觉得fs.watch()有些奇怪但我可能会发疯,他们很抱歉我昨晚不得不睡觉,这样我才能起床上班。你有没有解决过这个问题?如果没有,你能提供你在这个最小的例子中使用的
package.json
文件吗?我想测试一下。干得好!可能想在Winstons GitHub上打开一个问题。如果没有,Def听起来像是Winston的问题这个问题只有在你将Winston添加到我创建的演示中后才会发生(证明Winston是破坏它的东西)…请随意参考我制作的演示,并告诉他们Winston添加后演示会中断(Winston写入日志,而不是触发文件观察者)…祝你好运!干杯。我应该提到,我确实搜索了他们的开放和关闭的问题,但找不到该问题的问题,因此我认为还没有人为此提交问题。谢谢,我已经阅读了文档,并且“在某些情况下不可用”非常模糊。我在Windows计算机上。我要查找的是代码是否有问题,或者这是否属于“某些情况”部分不可用。如果有帮助,请参阅我的更新答案。是的,文档有点模糊,但在各种文件系统中支持此功能确实很难,而且也很难完整记录。感谢更新。我不确定为什么会有此检查,但在删除它后,它没有帮助。日志已被删除g已写入日志文件,但仍未检测到文件更改。如果打开日志文件,则为VScode并键入d
// src/logger.js
const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    new winston.transports.File({ filename: 'logs/combined.log' })
  ]
});

module.exports = logger
// public/index.html
<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost:8888');
</script>
// simplified test
const logger = require('./logger');
const fs = require('fs');

fs.watch('./logs/combined.log', event => {
  if (event === 'change') {
    console.log('log file has updated');
  }
});

function intervalFunc() {
  logger.info('new log message');
}
setInterval(intervalFunc, 5000);