2017-01-05 142 views
0

我有一个订阅对话框,它接收电子邮件地址,然后将其插入Mailchimp。POST函数运行两次,第一次API调用失败,第二次运行。

它的抛出错误使得体验不是很好。进一步调查后,它看起来像POST正在运行两次。

它第一次运行api调用总是失败,但它再次运行并工作,并将电子邮件放入数据库中。

我试图找到问题的原因,因为它运行两次AJAX功能总是触发一个错误,这意味着基于函数是成功的(在可变subscribeissuccess点我不能做的事情。

任何帮助,将不胜感激

AJAX的功能:

$.ajax({ 
     type: "POST", 
     url: "/subscribe", 
     data: data, 
     success: function(data){ 
      $("#subscribe-form2 :input").prop("disabled", false); 
      if(data.success){ 

       subscribeissuccess = 'TRUE'; 

      } else { 
       $('#subscribe-message2').html('Error occurred during subscribe. Please try again later.'); 
      } 
     }, error: function(){ 
      $("#subscribe-form2 :input").prop("disabled", false); 
      $('#subscribe-message2').html('Error occurred during during subscribe. Please try again later.'); 
     } 
}); 

的API插入/订阅:

module.exports = function(req, res){ 
var emailId = req.body.email; 
var button = req.body.subscribe; 
var api = require('../api'); 

var apikey = "removed"; 
var listid = "removed"; 

var body = JSON.stringify({apikey: apikey, id: listid, email: {'email': emailId}, merge_vars:{groupings:[{name:"MERGE1", groups:[button]}]}, double_optin: false, send_welcome: false}), 
link = "/2.0/lists/subscribe.json"; 

api.call(link, body, function(data){ 
    try{ 
     var ret = JSON.parse(data); 
     console.log(data); 
     if(ret.leid && ret.euid) res.json({success: true}); 
     else if(ret.code && ret.code == 214) res.json({success: true}); 
     else res.json({success: false}); 
    } catch(e){ 
     res.json({success: false}); 
    }  
}, function(err){ 
    res.json({success: false}); 
}); 
}; 

在 '... API'

module.exports = { 
call: function (endpoint, body, callback, errcallback){ 
    var http = require('https'); 
    var options = { 
     host: 'us5.api.mailchimp.com', 
     post: 443, 
     path: endpoint, 
     headers: { 
      "Content-Type": "application/json", 
      "Content-Length": Buffer.byteLength(body), 
      accept: '*/*' 
     }, 
     method: 'POST'}; 

    var req = http.request(options, function(res){ 
     console.log('STATUS:' + res.statusCode); 
     console.log('HEADERS: ' + JSON.stringify(res.headers)); 
     res.setEncoding('utf8'); 
     var data = ''; 
     res.on('data', function(chunk){ 
      data = data + chunk; 
     }); 
     res.on('end', function(){ 
      callback(data); 
     }); 
    }); 

    req.on('error', function(e){ 
     console.log('problem with request: ' + e.message); 
     errcallback(e); 
    }); 
    req.write(body); 
    req.end(); 
} 
}; 

的错误,我得到在成功添加一个电子邮件的功能:

STATUS:500 
HEADERS: {"server":"openresty","content-type":"application/json; charset=utf-8","content-length":"128","x-mailchimp-api-error-code":"-100","date":"Thu, 05 Jan 2017 22:59:51 GMT","connection":"close","set-cookie":["_AVESTA_ENVIRONMENT=prod; path=/"]} 
{"status":"error","code":-100,"name":"ValidationError","error":"The email parameter should include an email, euid, or leid key"} 
POST /subscribe 200 146ms - 17b 
STATUS:200 
HEADERS: {"server":"openresty","content-type":"application/json; charset=utf-8","content-length":"63","vary":"Accept-Encoding","date":"Thu, 05 Jan 2017 22:59:51 GMT","connection":"close","set-cookie":["_AVESTA_ENVIRONMENT=prod; path=/"]} 
{"email":"[email protected]","euid":"24d1d1b89e","leid":"118400873"} 
POST /subscribe 200 277ms - 16b 
+2

我的猜测是,当你发送AJAX请求时,你并没有阻止默认的表单提交。 – Barmar

+0

如果您发布您的表单HTML和事件代码,它将有助于确认@Barmar的意见(我同意) –

+0

感谢您的建议!它变得更简单。当我去这里复制代码时,我注意到我有两个事件处理程序运行订阅功能,一个在HTML表单中,一个在jquery.main.js中。我删除了HTML中的一个,不再有这个问题。 –

回答

0

作用于从@barmar和@Xeren Narcy我建议当发现我有两个事件处理程序,每个处理程序都运行订阅功能。一个在HTML表单中,一个在jquery.main.js中,当我删除一个时,问题就消失了。

相关问题