2016-06-30 1 views
0

У меня есть этот КОА маршрут /landing который в результате 404.Отправка ответа на клиент внутри request.POST обратного вызова в коа

function* landing() { 
    //this.body = "response"; //1 
    var request = require('request'); 
    request.post('http://url.com/resource', 
    { json: { key: "post data"} }, 
    function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
      var token = body.data; 
      getListByToken(token, function(list){ 
       this.body = list; //2 
      }); 
     } 
    }); 
} 

Смотрите комментарий в верхнем //1 - то, как вы определяете тело ответ в koa на маршруте. Вместо //1 Я хочу отправить ответ от //2 i.e изнутри этого request.get.

Когда пользователь перенаправляется на /landing, запрос на отправку должен получить некоторые данные с URL-адреса. Эти извлеченные данные должны использоваться getListByToken для приведения некоторых других данных, list, которые должны быть отправлены пользователю. Вышеприведенный код должен сработать, но это приводит к ошибке 404Not Found от koa.

ответ

0

Решено с q. Это заставляет koa удерживать реакцию до тех пор, пока не произойдет выход.

var q = require('q'); 
function* landing() { 
    var deferred = q.defer(); 
    var request = require('request'); 
    request.post('http://url.com/resource', 
    { json: { key: "post data"} }, 
    function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
      var token = body.data; 
      getListByToken(token, function(list){ 
       deferred.resolve(repolist); 
      }); 
     } 
    }); 
    this.body = yield deferred.promise; 
} 

Благодаря https://stackoverflow.com/a/22159513/1128379

1

Мы можем использовать обещание, простой и чистый способ управления асинхронными кодами.

var request = require('request-promise'); 

. . . 

function* landing() { 
    try { 
    let response = yield request({ 
     method: 'POST',, 
     url: 'http://url.com/resource', 
     headers: { 'content-type': 'application/json' }, 
     body: JSON.stringify({ json: { key: "post data"} }) 
    }); 

    this.body = yield new Promise(function(resolve, reject) { 
     if (response.statusCode == 200) { 
     getListByToken(response.body.token, function(list) { 
      resolve(list); 
     }); 
     } 
    }); 
    } catch (err) { 
    /* do something with your errors */ 
    } 
} 
Смежные вопросы