2017-01-05 172 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中,當我刪除一個時,問題就消失了。

相關問題