node.js - 使用 fs 的节点 js“错误:结束后写入”
问题描述
我有一段代码在 node js 中运行,它通过套接字读取传入的数据。信息显示在控制台上,这很有用,但我还想将其写入文本文件以进行进一步分析。但是,由于我配置了代码,它可以工作,但只是不断覆盖文件的内容。我已经更改了它以尝试确保文本文件不会不断被覆盖。我现在收到“结束后写入”错误。我附上了下面的代码。如果变量“data”中的原始数据保存在文本文件中,我希望它。那会很好。多谢你们
Load the TCP Library
var net = require('net');
var fs = require('fs');
// Keep track of the chat clients
var clients = [];
var tcpport = 13000;
var tcphost;
var wstream = fs.createWriteStream('myOutput.txt');
// Start a TCP Server
net.createServer(function (socket) {
// Identify this client
socket.name = socket.remoteAddress + ":" + socket.remotePort;
// Put this new client in the list
clients.push(socket);
// Send a nice welcome message and announce
console.log("Welcome " + socket.name);
console.log(socket.name + " joined");
// Handle incoming messages from clients.
socket.on('data', function (data) {
console.log('Incoming Data: ' + data.toString());
wstream.write(data.toString());
wstream.end();
var str = data.toString().split("@");
if (str[1] == 'Pong'){
broadcast('AnnouncerKit@AckPong@$');
broadcast('AnnouncerKit@Ping@$');
}
if (str[1]== 'AckPing'){
broadcast('AnnouncerKit@GetInfo@$');
}
if (str[1]== 'Store'){
broadcast('AnnouncerKit@AckStore@'+str[str.length-2]+'@$');
//console.log(bibs);
}
});
// Remove the client from the list when it leaves
socket.on('end', function () {
clients.splice(clients.indexOf(socket), 1);
console.log(socket.name + " left");
});
// Send a message to all clients
function broadcast(message) {
clients.forEach(function (client) {
client.write(message);
});
// Log it to the server output too
console.log('Outgoing Data: ' + message);
}
}).listen(tcpport);
console.log("TCP server running at port " + tcpport);
enter code here
也仅供参考,这是工作代码,但它会覆盖。
// Load the TCP Library
var net = require('net');
// Keep track of the chat clients
var clients = [];
var tcpport = 13000;
var tcphost;
// Start a TCP Server
net.createServer(function (socket) {
var fs = require('fs');
// Identify this client
socket.name = socket.remoteAddress + ":" + socket.remotePort;
// Put this new client in the list
clients.push(socket);
// Send a nice welcome message and announce
console.log("Welcome " + socket.name);
console.log(socket.name + " joined");
// Handle incoming messages from clients.
socket.on('data', function (data) {
console.log('Incoming Data: ' + data.toString());
var wstream = fs.createWriteStream('myOutput.txt');
wstream.write(data.toString());
wstream.end();
var str = data.toString().split("@");
if (str[1] == 'Pong'){
broadcast('AnnouncerKit@AckPong@$');
broadcast('AnnouncerKit@Ping@$');
}
if (str[1]== 'AckPing'){
broadcast('AnnouncerKit@GetInfo@$');
}
if (str[1]== 'Store'){
broadcast('AnnouncerKit@AckStore@'+str[str.length-2]+'@$');
//console.log(bibs);
}
});
// Remove the client from the list when it leaves
socket.on('end', function () {
clients.splice(clients.indexOf(socket), 1);
console.log(socket.name + " left");
});
// Send a message to all clients
function broadcast(message) {
clients.forEach(function (client) {
client.write(message);
});
// Log it to the server output too
console.log('Outgoing Data: ' + message);
}
}).listen(tcpport);
console.log("TCP server running at port " + tcpport);
以及文本文件中的结果输出
Finish@Store@000064919:13:36.505 1 03 155641803211E@000089619:13:36.826 1 0F 155661803213D@683@$
解决方案
在第二个片段中,使用:
var wstream = fs.createWriteStream('myOutput.txt', {flags: 'a'});
wstream.write(data.toString());
wstream.end();
以这种方式设置标志会给你一个写入文件末尾的写入器。有关其他可用选项,请参阅文档。
在第一个代码片段中,您收到“结束后写入”错误,因为您在关闭(结束)后写入流。writer.end()
关闭流。它会在第一次收到数据时工作,但是在写入套接字的每个后续数据块上,您都使用已经结束的同一个写入器。在第二个片段中,您不会收到此错误,因为在回调中您每次收到数据时都在重新创建流。希望这可以帮助。
推荐阅读
- kubernetes - Openstack Heat 和 Kubernetes 部署集成
- javascript - 显示平铺显示失败的替代图像/平铺(D3 Geo Tiles)
- arrays - 下载远程图像后延迟数据源方法
- java - Spring @Scheduled 执行作业的次数超过预期次数
- python-3.x - 如何在python中维护TransformDict中的键
- sql - SQL 更新连接最大值
- python - 符号链接 /env/.Python 的目标文件不存在于您站点的存储库中
- node.js - Node.js dns.resolve 未返回正确的 IP 地址
- sql - SQL 查询:我想使用联结表显示用户名和角色描述
- java - Redis 分布式锁混淆结果与 Lua 脚本