node.js - 使用mailgun API从HTTP请求转换为在Meteor nodejs服务器中获取以发送消息的问题
问题描述
这段代码,使用基于流星请求的包 HTTP 来调用 mailgun api 已经工作了多年:
HTTP.post(process.env.MAILGUN_API + '/messages', {
auth: 'api:' + process.env.MAILGUN_API_KEY,
params
}, function(error, result) {
if (error) {
standardServerError(error, 'while sending email to ' + params.to);
// throw error;
}
});
Meteor 在 Meteor 2.0 中弃用了 HTTP / request 包。所以我转换为 fetch 如下
const response = await fetch(process.env.MAILGUN_API + '/messages', {
method: 'POST',
headers: {
'Authorization': 'Basic ' + Buffer.from('api:' + process.env.MAILGUN_API_KEY).toString('base64'),
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
});
return response;
不幸的是,它不起作用。使用 statusText 'BAD REQUEST' 获取响应代码 400 参数相同并且不推荐使用的调用有效。
答案是,当您使用 http 调用 mailgun api 时,会在幕后发生一些神奇的转换。使用 fetch 时,魔法不会发生。如果我在发出 mailgun 请求之前将 JSON 数据显式转换为表单数据,那么它会按预期工作。
let formData = multipartFormData(params);
const response = fetch(mailgunEndpoint + '/messages', {
method: 'POST',
headers: _.extend({
'Authorization': 'Basic ' + Buffer.from(`${mailgunUser}:${mailgunAPIKey}`).toString('base64'),
}, formData.headers),
body: formData.content
}).then(response => {
if (traceSendEmail) {
console.warn(`{status: ${response.status}, statusText: ${response.statusText}}`);
}
return response;
}).catch(err => {
standardServerError(err, 'while sending email to ' + params.to);
return false;
});
解决方案
推荐阅读
- jsf - 折叠时在 Primefaces 字段集中显示一些内容
- javascript - 是否有用于放大多个图表(highcharts)的通用时间范围小部件
- laravel - Alpine JS Alpine 错误:“TypeError:无法读取未定义的属性 '$wire'”
- r - 具有多个 (x,y) 对的数据帧的高格式
- java - 如何使用 QueryDsl 正确创建 JPAQueryFactory
- azure - 如何参数化 Azure 逻辑应用标准项目的 workflow.json 和 connections.json 文件中的值
- wpf - 第二次运行脚本后填充脚本中的变量
- streaming - hls只播放音频,但视频是黑色的
- html - Html 自动完成输入在 React 中不起作用
- postgresql - 使用 Postgres 查询在特定时间之间选择多个数据以及平均值