首页 > 解决方案 > 使用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;
        });

标签: node.jsmeteorfetchmailgun

解决方案


推荐阅读