2017-01-05 3 views
0

У меня есть диалог подписки, который берет адрес электронной почты, а затем вставляет его в Mailchimp.Функция POST выполняется дважды, первый вызов API не выполняется, второй раз он работает.

Ошибки его выброса, которые делают этот опыт не очень хорошим. После дальнейшего исследования похоже, что POST запускается дважды.

При первом запуске вызов api всегда терпит неудачу, но затем он снова запускается и работает, и электронное письмо помещается в базу данных.

Я пытаюсь найти проблему, потому что, так как он работает в два раза функция AJAX всегда вызывает ошибку, которая означает, что я не могу сделать что-то на основе функции быть успешным (точка переменной subscribeissuccess ниже.

Любая помощь будет принята с благодарностью

Аякса функция:.

$.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}); 
}); 
}; 

Функция в '...' апи

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

Спасибо за предложение! Это оказалось проще. Когда я пошел копировать код здесь, я заметил, что у меня было два обработчика событий, работающих под подпиской funtion, один в форме HTML и один в jquery.main.js. Я удалил его в HTML и больше не имею этой проблемы. –

ответ

0

Действуя по предложениям от @barmar и @Xeren Narcy I что у меня было два обработчика событий, каждый из которых выполнял функцию подписки. Один в форме HTML и один в jquery.main.js, когда я удалил проблему, проблема исчезла.