在 restify js 上处理网络套接字响应

handling net socket response on restify js

我正在使用 restify 在 nodeJs 中编写一个中间件,但我无法处理来自服务器的异步响应:

在我的 index.js 中调用了以下代码:

 app.get('/get-users', [getUsers]);
 ...

 function getUsers(req, res) {
    var query = {type:'get-users', parameters:{}, content:[]};
    res.set('Content-Type', 'application/json');
    var queryJson = JSON.stringify(query);
    var message = queryJson+"\n";
    res.send(client.writeToServer(message));
   }

writeToServer 函数在一个名为 mySocket.js:

的单独文件中
  var net = require('net');
  var host = '127.0.0.1';
  var port = 6011;
  var response;
  var client;

  var Promise = require('promise');

  client = net.connect(port, host); 
  client.setEncoding("utf8");

  client.on('connect', function() {
     console.log('Connected');
  });


function getPromisedData(message) {
  if( client.write(message))
  return new Promise(function(resolve) {
                       console.log('calling client.once');
                       client.once('data', function(data) {
                           console.log('once.data logging: '+JSON.parse(data));
                           response = JSON.parse(data);
                           resolve(response); });
              });     
}

exports.writeToServer = function (message) {
   console.log('\nwriteToServer');
   getPromisedData(message).then(function(response) {
      console.log('promise resolved with response: '+response);
      return response;});
   }

尝试过但没有用。这是输出:

Connected

writeToServer
calling client.once
once.data logging: 
promise resolved with response: 

我是不是漏掉了什么?

提前致谢, 摩根

我不是 promises 专家,但我可以在这里看到几个可能的问题。首先,您应该始终使用大括号括起 if 语句之后的所有内容。

function getPromisedData(message) {
    if( client.write(message)) {
        return new Promise(function(resolve) {
                   console.log('calling client.once');
                   client.once('data', function(data) {
                       console.log('once.data logging: '+JSON.parse(data));
                       response = JSON.parse(data);
                       resolve(response); });
        }); 
    }
}

其次,当您调用 res.send 时,它会立即写回请求者。您还没有等待 client.writeToServer 呼叫 return 任何事情。 writeToServer 也应该 return 一个承诺,这样你就可以做这样的事情:

client.writeToServer(message).then(function(server_reponse){
    res.send(server_response);
    next();
}

坦率地说,我会放弃承诺并使用回调,直到您很好地了解正在发生的事情。