我已经读够了,知道我迷失了这个。其他线程上的解决方案似乎没有帮助。
我在pages。samedomain.com上有一个页面,在我的Node站点的apps。samedomain.com上调用了mandrill api。使用ORM,我可以通过表路由进行写操作。写入表格并收到页面确认后,应该触发电子邮件路由。在本地运行时,两者都可以正常工作。部署后,我得到...
XMLHttpRequest无法加载http://apps.samedomain.com/.../.../mail/4847775376401843。所请求的资源上不存在“ Access-Control-Allow-Origin”标头。因此,不允许访问源“ http://pages.samedomain.com”。响应的HTTP状态代码为502。
在我的app.js中,我有...
var cors = require('cors');
app.use(cors());
在我的路线文件中,我有...
module.exports = function(appRouter) {
var mandrill = require('mandrill-api/mandrill');
var mandrill_client = new mandrill.Mandrill(process.env.MANDRILL_API_KEY);
appRouter.route('/.../mail/:first_list_id').post(function(req,res){
req.models.know_me_2016
.find({list_id:req.params.first_list_id})
.run(function(err, results){
if (err) {
res.send(err);
} else {
var template_content = [{
"recipient": <stuff> ,
"content": <stuff>
}];
var message = {
<mandrill message object stuff>
};
}
mandrill_client.messages.sendTemplate({
"template_name": <template-name>,
"template_content": template_content,
"message": message}, function(result) {
console.log(result);
//I tried adding header stuff but it didn't help, maybe in wrong place? I thought CORS library was going to take care of this part?
res.header("Access-Control-Allow-Origin", "http://interactives.dallasnews.com");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
//It sends successfully when run local
res.send("Email sent successfully");
}, function(e) {
// Mandrill returns the error as an object with name and message keys
console.log('A mandrill error occurred: ' + e.name + ' - ' + e.message);
// A mandrill error occurred: Unknown_Subaccount - No subaccount exists with the id 'customer-123'
});
});
});
}
我的Mandrill密钥设置为接受所有IP。
任何见识将不胜感激。
初始化cors时需要将允许的来源添加到白名单中:
var whitelist = [
'http://samedomain.com',
'http://apps.samedomain.com',
'http://pages.samedomain.com'
// list whatever possible domains you have
]
var globalCorsOptions = {
origin: function(origin, callback) {
callback(null, whitelist.indexOf(origin) !== -1);
}
};
var cors = require('cors');
app.use(cors(globalCorsOptions));
在这种情况下,结果是缺少更新的.env文件。我们的私人git会忽略.env文件,因此不会发布凭据。 Mandrill无法连接。插入Mandrill凭据并更新.env远程后,它便开始按预期方式工作。