Узел js "error: write after end" с помощью fs - PullRequest
0 голосов
/ 06 июня 2018

У меня есть фрагмент кода, работающий в узле 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@$

1 Ответ

0 голосов
/ 06 июня 2018

Во втором фрагменте используйте:

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

, установив флаг таким образом, чтобы получить средство записи, которое записывает в конец файла.Обратитесь к документам для получения информации о других доступных опциях.

В первом фрагменте кода вы получаете сообщение об ошибке «запись после завершения», поскольку вы записываете в поток после его закрытия (завершения).).writer.end() закрывает поток.Он будет работать при первом получении данных, но на каждом последующем фрагменте данных, записываемых в сокет, вы используете тот же модуль записи, который уже завершился.Во втором фрагменте вы не получите эту ошибку, потому что при обратном вызове вы заново создаете поток при каждом получении данных.Надеюсь, это поможет.

...