Как вернуть данные net.socket из асинхронной функции AWS Lambda Node.js 8.10 в шлюз API AWS? - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть эта лямбда-функция:

exports.handler = async (event,context,callback) => {
  // console.log('Received event:', JSON.stringify(event, null, 2));
  var key=event.queryStringParameters.ref;
  // console.log('index.handler started with key : '+key);
  var RemoteServer='aaa.bbb.ccc.ddd';
  var net = require('net');
  var responce={
      "statusCode": 200,
      "headers": {
          "Content-Type": "*/*"
      }
  };

  var socket = new net.Socket();

  socket.setEncoding('utf8');

  socket.on('close', () => {
    console.log('Close.');
    console.log(JSON.stringify(responce));
    callback(null, JSON.stringify(responce));

  });
  socket.on('connect', () => {
    // console.log('Connect');
    var senddata='1,'+key;
    // console.log(('About to write :'+senddata));
    socket.write(senddata);
    console.log(('Wrote :'+senddata));
  });
  socket.on('data', (data) => {
    console.log('Data.');
    responce.body = data;
    console.log(JSON.stringify(responce));
    socket.end();
  });
  socket.on('end', () => {
    console.log('End.');
    console.log(JSON.stringify(responce));
  });
  socket.on('error', (error) => {
    console.log('Error' + error);
    socket.destroy;
    callback(error);
  });
  socket.on('timeout', () => {
    console.log('Timeout');
    socket.close;
    callback('Timeout');
  });

  socket.connect(11010, RemoteServer, () => { 
    // console.log('socket connect');
  });

  callback(null,responce); // This is here to get this to do anything.
};

Она работает так, что console.log показывает, что я получаю правильные данные в процедуре socket.on ('data').

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

Это мой вывод - console.log:

START RequestId: 7e1876fe-4255-12de-56d6-c187bcfff9ee Version: $LATEST
Wrote :1,R9H39X
Data.
{"statusCode":200,"headers":{"Content-Type":"*/*"},"body":"<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<group>\r\n  <data>\r\n    <name>COLIN MANNING</name>\r\n    <from>26/03/2018</from>\r\n    <to>31/05/2018</to>\r\n    <room>A31</room>\r\n    <location>X,Y</location>\r\n  </data>\r\n</group>\r\n"}
End.
{"statusCode":200,"headers":{"Content-Type":"*/*"},"body":"<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<group>\r\n  <data>\r\n    <name>COLIN MANNING</name>\r\n    <from>26/03/2018</from>\r\n    <to>31/05/2018</to>\r\n    <room>A31</room>\r\n    <location>X,Y</location>\r\n  </data>\r\n</group>\r\n"}
Close.
{"statusCode":200,"headers":{"Content-Type":"*/*"},"body":"<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<group>\r\n  <data>\r\n    <name>COLIN MANNING</name>\r\n    <from>26/03/2018</from>\r\n    <to>31/05/2018</to>\r\n    <room>A31</room>\r\n    <location>X,Y</location>\r\n  </data>\r\n</group>\r\n"}
END RequestId: 7e1876fe-4255-12de-56d6-c187bcfff9ee
REPORT RequestId: 7e1876fe-4255-12de-56d6-c187bcfff9ee    Duration: 178.76 ms     Billed Duration: 200 ms Memory Size: 1536 MB    Max Memory Used: 33 MB 

и обратный вызов:

{"statusCode":200,"headers":{"Content-Type":"*/*"}}

И это console.log без последнего обратного вызова:

START RequestId: c3dc7e69-87aa-1608-76d4-093a0e28711b Version: $LATEST
END RequestId: c3dc7e69-87aa-1608-76d4-093a0e28711b
REPORT RequestId: c3dc7e69-87aa-1608-76d4-093a0e28711b    Duration: 3.43 ms       Billed Duration: 100 ms Memory Size: 1536 MB    Max Memory Used: 33 MB

и обратного вызова:

null

Так что без обратного вызова ничего не выполняется.

Чего я хочу добиться: открыть сокет для сервера.отправить данные через сокет получить ответ от сервера через сокет закрыть сокет ответный ответ на API-шлюз

Это моя первая попытка асинхронных, лямбда и API-шлюзов Node.js.Я предполагаю, что у меня есть ошибка в том, как я понимаю асинхронные и обратные вызовы Node.js.

Как мне вернуть данные из слушателя socket.on ('close')?

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

Должен ли я использовать EventAsPromise и затем заблокироватькакое-то время (! сделано) {....}?Это похоже на философию асинхронного узла.

1 Ответ

0 голосов
/ 26 апреля 2018

ОК, так что я нашел этот пост:

Как я могу ждать в Node.js (Javascript), мне нужно сделать паузу на некоторое время

и пошел к ответу Аминадав.

Таким образом, я получаю эту функцию, объявленную перед моим существующим кодом:

function sleep(ms){
    return new Promise(resolve=>{
        setTimeout(resolve,ms)
    })
};

и теперь конец моего исходного кода выглядит так:

  socket.connect(11010, RemoteServer, () => {
    // console.log('socket connect');
  });

  while (!socket.destroyed) {
    await sleep(10);
  }

  callback(null,responce);
};

Так что теперь я получаю данные, возвращенные моей вызывающей функции.

Я не уверен, что sleep () - лучший способ сделать это, но он заставляет меня двигаться дальше. Это ответ, но я ценю, что это может быть не самый лучший ответ.

...