从 amazon-lambda 发送 post 请求时出现问题
Problem sending post request from amazon-lambda
在从亚马逊队列 (sqs) 检索到我的 API 的消息后,我正在尝试从 amazon-lambda 函数在 POST 中发送 http 请求。
API 将这些消息整合到我的数据库中。
为此,我将 Node.js 与承诺系统一起使用,但是当我在队列中发送大量消息时,请求没有发送,我不明白为什么。
我尝试了几种方法,包括使用 promiseAll 但没有成功
const http = require('http');
var promises = [];
const options = {
host: process.env.Host,
path: process.env.Path,
port: process.env.Port,
method: process.env.Method
};
exports.handler = async (event, context) => {
event.Records.forEach(record => {
const {
body
} = record; // the messages from the bus
promises.push(PromiseCreator(body));
Promise.all(promises)
.then(function(data) {})
.catch(function(err) {
return err
});
});
};
function PromiseCreator(body) {
return new Promise((resolve, reject) => {
const req = http.request(options, (res) => {
resolve('succès');
});
req.on('error', (e) => {
reject(Error(e));
});
// send the request
req.write(body);
req.end();
});
}
我认为问题出在 forEach 上,但我不知道我必须在哪里执行请求。
你可能是对的!
尝试将 promise.all
放在 forEach
之外。
您可以使用 await
代替 .then
exports.handler = async (event, context) => {
event.Records.forEach(record => {
const { body } = record; // the messages from the bus
promises.push(PromiseCreator(body));
});
try {
await Promise.all(promises);
} catch(err) {
return err;
}
};
我认为真正的问题是因为你的请求函数在没有监听错误的情况下立即解析成功,这是没有用的。名为 PromiseCreator
的函数的结构应类似于以下示例:
function PromiseCreator(body) {
return new Promise((resolve, reject) => {
const req = http.request(options, (res) => {
if (res.statusCode !== 200) {
reject("Connection error");
}
res.on('error', (error) => {
reject(error);
});
});
req.on('error', (e) => {
reject(Error(e));
});
req.on("finish", () => {
resolve("success");
})
// send the request
req.write(body);
req.end();
});
}
在从亚马逊队列 (sqs) 检索到我的 API 的消息后,我正在尝试从 amazon-lambda 函数在 POST 中发送 http 请求。 API 将这些消息整合到我的数据库中。 为此,我将 Node.js 与承诺系统一起使用,但是当我在队列中发送大量消息时,请求没有发送,我不明白为什么。
我尝试了几种方法,包括使用 promiseAll 但没有成功
const http = require('http');
var promises = [];
const options = {
host: process.env.Host,
path: process.env.Path,
port: process.env.Port,
method: process.env.Method
};
exports.handler = async (event, context) => {
event.Records.forEach(record => {
const {
body
} = record; // the messages from the bus
promises.push(PromiseCreator(body));
Promise.all(promises)
.then(function(data) {})
.catch(function(err) {
return err
});
});
};
function PromiseCreator(body) {
return new Promise((resolve, reject) => {
const req = http.request(options, (res) => {
resolve('succès');
});
req.on('error', (e) => {
reject(Error(e));
});
// send the request
req.write(body);
req.end();
});
}
我认为问题出在 forEach 上,但我不知道我必须在哪里执行请求。
你可能是对的!
尝试将 promise.all
放在 forEach
之外。
您可以使用 await
代替 .then
exports.handler = async (event, context) => {
event.Records.forEach(record => {
const { body } = record; // the messages from the bus
promises.push(PromiseCreator(body));
});
try {
await Promise.all(promises);
} catch(err) {
return err;
}
};
我认为真正的问题是因为你的请求函数在没有监听错误的情况下立即解析成功,这是没有用的。名为 PromiseCreator
的函数的结构应类似于以下示例:
function PromiseCreator(body) {
return new Promise((resolve, reject) => {
const req = http.request(options, (res) => {
if (res.statusCode !== 200) {
reject("Connection error");
}
res.on('error', (error) => {
reject(error);
});
});
req.on('error', (e) => {
reject(Error(e));
});
req.on("finish", () => {
resolve("success");
})
// send the request
req.write(body);
req.end();
});
}