Node.js "net.createConnection ()" ошибка обратного вызова не излучает - PullRequest
0 голосов
/ 12 января 2019

Я хочу подключиться к серверу Unix Domain Socket в приложении Node. Если соединение установилось успешно и было открыто, цикл (который может занять некоторое время) должен быть выполнен. Если во время выполнения этого цикла возникает ошибка, он должен получить какое-то уведомление. Если соединение с клиентом вообще невозможно, цикл не должен выполняться в первую очередь (кажется, что он работает с Promise). Для меня это звучит как самая простая вещь в мире, но я просто не могу заставить ее работать ... Вот что у меня есть до сих пор:

  new Promise(function(resolve, reject) {
    let connection = net.createConnection('/tmp/socket.s', () => {resolve(connection);})
      .on('data', function(data) {
        // Do something (during loop execution)
      })
      .on('error', reject); // If this callback is executed, the while loop should terminate (by receiving some kind of signal within the loop)
  }).then(function(connection) {
    for(...) {
      // Do stuff that takes some time, executes other callbacks, sends data to the socket
    }
    connection.end();
  }, function(error) {
    // Error handling
  });

Чего мне не хватает?

1 Ответ

0 голосов
/ 13 января 2019

Попробуйте прослушать событие данных в разделе разрешения обещания. Следующий код должен сделать это:

const net = require('net');

/**
 * Client
 * --------------------------------------------
 */

new Promise((resolve, reject) => {
    let client = net.createConnection({ path: '/tmp/socket.s'}, () => {
        console.log('Client: connected ')
        resolve(client);
    });

    // Reject on error
    client.on('error', err => reject(err) );

    client.on('end', () => {
        console.log('Client: disconnected from server #1');
    });
}).then( connection => {
    connection.on('data', data => {

        // Do stuff with the data
        console.log(`Client: the server says: ${data.toString()}\n`);

        if(data != 'Data recieved'){
            // Just to ensure that the following loop runs only once
            for (let i = 0; i <= 10; i++) {
                setTimeout(() => {
                    // Send data to the server
                    connection.write(`Client Data ${i}`);
                    if (i == 10) {
                        // Close the connection after everything is done
                        connection.end();
                    }
                }, i*2000);
            }
        }
    });
}, error => {
    console.log('Client: promise rejection error', error );
});

Мой тестовый сервер выглядит так

const net = require('net');


/**
 * Server
 * --------------------------------------------
 */

const server = net.createServer( connectionListener => {
    console.log(`#${process.pid} Server: client connected`);
    connectionListener.on('end', () => {
        console.log(`#${process.pid} Server: client disconnected`);
    });
    connectionListener.write('Hello\r\n');
    connectionListener.on('data', data => {
        console.log(`#${process.pid} Server: client sends: ${data.toString()}`);
        connectionListener.write('Data recieved');
    });
});

server.on('error', (err) => {
    console.log(err);
    server.close();
});
server.listen('/tmp/socket.s', () => {
    console.log(`#${process.pid} Server: server bound`);
});

process.on('exit', code => {
    console.log(code);
    server.close();
});

process.on('SIGTERM', () => server.close() );

process.on('SIGINT', () =>  server.close() );

В этом примере клиент отправляет данные на сервер, и сервер отвечает каждый раз. Затем клиент закрывает соединение после отправки данных 10 раз.

P.S. Нет необходимости использовать Обещание, если вам не нужно возвращать обещание в какой-то момент кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...