簡體   English   中英

Node.js“ net.createConnection()”錯誤回調未發出

[英]Node.js “net.createConnection()” error callback not emitting

我想連接到Node應用程序中的Unix Domain Socket服務器。 如果連接成功並被打開,則將執行一個循環(可能需要一些時間)。 如果在執行此循環期間發生錯誤,則它應該收到某種通知。 如果根本無法連接到客戶端,則不應首先執行循環(這似乎與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
  });

我想念什么?

嘗試在promise的resolve部分中偵聽數據事件。 下面的代碼應該這樣做:

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次后關閉連接。

PS除非您確實需要在代碼中的某個點返回承諾,否則無需使用Promise。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM