У меня есть эта лямбда-функция:
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 и затем заблокироватькакое-то время (! сделано) {....}?Это похоже на философию асинхронного узла.