繁体   English   中英

如何从AWS Lambda Node.js 8.10异步函数向AWS API网关返回net.socket数据?

[英]How to return net.socket data from AWS Lambda Node.js 8.10 async function to AWS API gateway?

我有这个Lambda函数:

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')例程中获取了正确的数据。

但是,它无法在回调中返回responce.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网关的答复

这是我第一次尝试使用Node.js异步,Lambda和API网关。 我假设我在理解Node.js异步和回调的方式上有错误。

如何从socket.on('close')侦听器返回数据?

在我看来,侦听器中的回调从未被调用,我也无法确定如何使异步函数中的回调等待来自侦听器的数据。

我是否应该使用EventAsPromise然后在一段时间内(!done){....}进行阻止? 这违反了Node异步哲学。

确定,所以我找到了这篇文章:

我如何在Node.js(Javascript)中等待,我需要暂停一段时间

然后听了Aminadav的回答。

因此,我最终在现有代码之前声明了此函数:

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()是执行此操作的最佳方法,但它会让我继续前进。 这是一个答案,但我知道这可能不是最佳答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM