2013-12-19 5 views
0

Я пытаюсь отправить сообщение статуса клиенту с помощью вызова ajax с использованием метода GET. Мои данные для сервера Nodejs проходят нормально, но я не могу отправить данные моему клиенту. Я использую expressjs в качестве моей структуры. Я знаю, что данные существуют, потому что когда я console.log (ошибка), я получаю объект, такой как {[Ошибка: [email protected] уже добавлена]}, но я не могу передать это сообщение клиенту.отправка данных из nodejs клиенту не работает

Вот это route.js: она захватывает (\ подписаться) на app.js

function signUp(name, email){ 
    var MailChimpAPI = require('mailchimp').MailChimpAPI; 
    var API_KEY = 'asdfasdf', 
      LIST_ID = 'asdfasdfas'; 
    var api = new MailChimpAPI(API_KEY , { version : '1.3', secure : false }); 
    var names = name.split(' '), status; 
    var data ={ 
      apikey: API_KEY, 
      id: LIST_ID, 
      email_address : email, 
      merge_vars: {'FNAME': names[0], 'LNAME': names[1]}, 
      double_optin: false, 
      send_welcome: true 
     }; 

    api.listSubscribe(data, function(error) { 

      if(error != null){ 
       console.log(error); 
       status = error; 
      }else { 
      console.log('success'); 
       status= '{success}'; 
      } 
     }); 

    return status; 
} 


exports.send = function(req, res, next){ 
    var name = req.query.name, email = req.query.email; 
    res.writeHead(200, {"Content-Type": "json"}); 
    res.send(signUp(name, email)); 
    res.end(); 

} 

Вот мой клиент сторона: (возвращает нуль)

$.ajax({ 
    url:'subscribe', 
    method: 'GET', 
    data: {name: name, email: email}, 
    dataType: 'JSON', 
    success: function(res){ 
    alert(res); 
    } 
+0

Тогда как должен выглядеть макет? любой пример? – ravi

ответ

0

Я не знаю, API (mailchimp), который вы используете, поэтому решение может быть совершенно неправильным. Но в целом вы можете видеть разницу между синхронным и асинхронным программированием. Пожалуйста, прочитайте несколько руководств, чтобы полностью понять способ Node.js, потому что требуется некоторое время, чтобы охватить такой вид программирования :-)

Самое главное, что функции обычно не возвращают значения, а вызовы обратного вызова - (иногда не называются callback, но done), когда они готовы или возникла ошибка.

function signUp(name, email, callback) { // <----- provide a callback 
    var MailChimpAPI = require('mailchimp').MailChimpAPI; 
    var API_KEY = 'asdfasdf', 
     LIST_ID = 'asdfasdfas'; 
    var api = new MailChimpAPI(API_KEY, { version: '1.3', secure: false }); 
    var names = name.split(' '), status; 
    var data = { 
     apikey: API_KEY, 
     id: LIST_ID, 
     email_address: email, 
     merge_vars: {'FNAME': names[0], 'LNAME': names[1]}, 
     double_optin: false, 
     send_welcome: true 
    }; 

    api.listSubscribe(data, function (error, result) { 
     if (error) { 
      console.log(error); 
      callback(error); // <--- this is one of the "exit"-points of the function 
     } else { 
      console.log('success'); 
      callback(null, result); // <--- this is another 
     } 
    }); 
    // <----------- no return! nobody cares about the return value. 
} 


exports.send = function (req, res, next) { 
    var name = req.query.name, email = req.query.email; 
    res.writeHead(200, {"Content-Type": "json"}); 
    signUp(name, email, function (err, result) { 

     // this function gets called when signUp is done (maybe seconds later) 

     if (err) { 
      res.send(500); 
      return; 
     } 
     // don't know what the result looks like 
     res.send({status: 'success'}); 
     // res.end(); DON'T USE res.end() in express! 
    }); 
}; 
+0

эй быстрый вопрос, можно ли добавлять операторы return к функциям в nodejs? – ravi

+0

Всё нормально. Возвращаемые значения асинхронных функций всегда будут игнорироваться вызывающим, а синхронные функции могут рассматриваться как на всех других распространенных языках программирования. Вы можете часто видеть обратный вызов (ошибка) 'даже функция обратного вызова не возвращает значение, отличное от' undefined'. Это делается только для того, чтобы получить более короткий код, но может ввести в заблуждение неопытных читателей. – hgoebl

Смежные вопросы