我正在尝试从服务器端存在的 meteor 方法返回客户端响应或错误。该方法本身是用于在提交表单时向API提交发布请求,我希望在客户端能够返回API的响应,以便我可以向用户发送信息,例如该电子邮件地址已经存在。这是我到目前为止所拥有的。
当成功调用该方法时,我会在console.log(result);
的客户端上收到201响应,但是当POST提交给出400或任何错误时,我也希望控制台记录该错误。
服务器/main.js
Meteor.methods({
addSub(email) {
var emailAddress = {
"lists": [
{
"id": "1395617465"
}
],
"email_addresses": [
{
"email_address": email
}
]
}
HTTP.post('https://api.constantcontact.com/v2/contacts?api_key=<api-key>', {
headers: {
'Authorization': 'Bearer <token>',
'Content-Type': 'application/json'
},
data: emailAddress
}, function (error, response) {
if ( error ) {
console.log( error );
throwError = error;
} else {
console.log(response);
returnResponse = response;
}
});
return returnResponse;
}
});
客户端/main.js
Template.info.events({
'submit #cm-subscribe'(event){
event.preventDefault();
var form = event.target;
var email = form.email.value;
Meteor.call('addSub', email, (error, result) => {
console.log(result);
});
}
});
client/main.html
<template name="info">
<h2>Signup For Our Newsletter</h2>
<form id="cm-subscribe">
<input field name="email" type="email" value="email">
<input type="submit">
</form>
</template>
最佳答案
1)您的代码当前包含竞争条件。可以或可以不设置returnResponse
的值,具体取决于回调和return语句之间的执行顺序。相反,您应该使用Promises,它允许您以同步方式包装异步代码。关于如何执行此操作,on the Meteor blog上有一篇不错的文章。请注意,这不会影响客户端行为-仍将像您一样使用回调。
2)在客户端看不到错误的原因是Meteor故意将所有正常的Javascript错误(如HTTP.post返回的错误)转换为内部服务器错误,以保护数据和源代码。您应该做的是处理服务器端的所有错误,并为预期的无效响应返回新的Meteor.Error
对象。这些可以由客户端处理。对此的全面解释可以在Meteor Guide.中找到
像这样:
Meteor.methods({
addSub(email) {
return new Promise((resolve, reject) => {
HTTP.post('<URL>', ..., function(error, response){
if(!error){
resolve(response);
} else if (error == <Some Error Comparison>){
reject(new Meteor.Error("Email.subscription.invalidEmail", "You put in an invalid email"));
}
});
});
}
}