簡體   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