2015-02-27 2 views
0

У меня возникли трудности с написанием правильного обратного вызова. Когда пользователь делает запрос на сервер «/ city», он должен отправить запрос сторонней службе для запроса данных. Для этого я делаю http.request(), чтобы запрашивать и получать данные (нет проблем). И тогда мне нужно перенести данные в функцию res.send() вне функции getCity().отправить ответ после request.end()

Я понятия не имею. Пожалуйста, объясните мне решение и принцип работы. Спасибо!

var getCity = function(response) { 
    var str = '' 
    response.on('data', function (chunk) { 
    str += chunk; 
    }); 

    response.on('end', function() { 
     //what to do? 
    }); 
} 

app.get('/city', function (req, res) { 
    var request = http.request(options, getCity); 
    request.end(); 
    res.send("ok"); //need sending str from getCity instead of "ok"; 
}); 

ответ

2

Я рекомендую использовать следующий подход, чтобы сделать некоторые разрешающую рода задач,

var cityDecorator = function(req,res,next) { 
    var str = '' 
    http.request(options, function(response){ 
    response.on('data', function (chunk) { 
     str += chunk; 
    }); 

    response.on('end', function() { 
     req.params.cityValue = str; // N1 
     next(); // N2 
    }); 
    }).end(); 
} 

app.get('/city',cityDecorator, function (req, res) { 
    res.send(req.params.cityValue); 
}); 

N1: Вы можете отправить ответ от только этой линии, но я предпочитаю и рекомендую отправить ответ из одного файла только, поэтому в будущем, если вы хотите изменить res, или хотите украсить, или визуализировать или что-то еще, вам просто нужно иметь дело с одним файлом, то есть с вашим файлом маршрутов.

Это будет работать только в том случае, если вы используете экспресс, из вашего кода выглядит так, как вы, но если нет, то комментируйте, я предоставил решение для этого сценария. GL

+0

Ничего себе, это работает! Но я не понимаю, как работает «next()» ... app.get() выглядит как app.get ('/ city', callback (req, res, next) [, callback (req, res, next) ...]), когда «следующий» вызывает новый обратный вызов? – Archarious

+0

Это называется промежуточным программным обеспечением уровня маршрутизатора, поэтому он переходит к следующей функции обратного вызова или если функции обратного вызова не определены, то будет запускаться соответствующий маршрут. Подробнее здесь: http://expressjs.com/guide/using-middleware.html#middleware.router –

+0

Ну, это то, что мне нужно! Большое спасибо! – Archarious

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