首页 > 解决方案 > 使用 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@$

标签: node.jsfs

解决方案


在第二个片段中,使用:

var wstream = fs.createWriteStream('myOutput.txt', {flags: 'a'});
wstream.write(data.toString());
wstream.end();

以这种方式设置标志会给你一个写入文件末尾的写入器。有关其他可用选项,请参阅文档

在第一个代码片段中,您收到“结束后写入”错误,因为您在关闭(结束)后写入流。writer.end()关闭流。它会在第一次收到数据时工作,但是在写入套接字的每个后续数据块上,您都使用已经结束的同一个写入器。在第二个片段中,您不会收到此错误,因为在回调中您每次收到数据时都在重新创建流。希望这可以帮助。


推荐阅读