2016-08-05 6 views
0

Я, вероятно, ничего не понимаю о JS, но у меня возникла проблема с записью чистого ответа на тело страницы. Как здесь:Самый чистый запрос в KOA

var koa = require('koa') 
 
    , session = require('koa-session') 
 
    , mount = require('koa-mount') 
 
    , koaqs = require('koa-qs') 
 
    , accesslog = require('koa-accesslog') 
 
    , router = require('koa-router')() 
 
    , app = koa(); 
 

 
var Grant = require('grant-koa') 
 
    , grant = new Grant(require('./config.json')) 
 

 
app.keys = ['grant'] 
 
app.use(accesslog()) 
 
    .use(session(app)) 
 
    .use(mount(grant)) 
 
    .use(router.routes()) 
 
    .use(router.allowedMethods()); 
 
koaqs(app) 
 

 
router.get('/handle_facebook_callback', function *(next) { 
 
    getProfile(this.query.access_token); 
 
\t 
 
}) 
 

 
var config = { 
 
    "facebook": { 
 
    "https://graph.facebook.com": { 
 
     "__domain": { 
 
     "auth": { 
 
      "auth": {"bearer": "[0]"} 
 
     } 
 
     }, 
 
     "{endpoint}": { 
 
     "__path": { 
 
      "alias": "__default" 
 
     } 
 
     } 
 
    } 
 
    } 
 
} 
 

 
var request = require('request') 
 
    , purest = require('purest')({request}) 
 
    , facebook = purest({provider: 'facebook', config}) 
 

 
function getProfile(access_token, responseToBody){ 
 
\t facebook.get('me') 
 
      .auth(access_token) 
 
\t \t \t .request(function (err, res, body) { 
 
\t \t \t \t this.body=JSON.stringify(body,null,2); 
 
    }) 
 
} 
 

 

 
if (!module.parent) app.listen(3000); 
 
console.log('oh!GG is running on http://localhost:3000/');

Я бы предположил, в функции facebook.request "this.body = JSON.stringify (тело, нуль, 2);" часть должна написать ответ в тело, однако это не так. В чем конкретно проблема?

+0

Ude body.innerHtml –

+0

И не могли бы вы уточнить, есть ли он на сервере или на стороне пользователя? –

+0

KOA - это серверная платформа для nodejs =] – Medardas

ответ

3

Маршрут (генератор) не ждет getProfile, чтобы закончить. Вам нужно yield.

Прямо сейчас в вашем фрагменте, он выполняет getProfile, который немедленно возвращается к генератору, генератор заканчивается, Коа видит, что вы не установили this.body, поэтому он по умолчанию имеет ответ 404.

Как только обратный вызов в getProfile, наконец, загорается в какой-то более поздней точке, ответ уже отправлен, и вы получите сообщение об ошибке.

Общее решения для получения функции обратного вызова стиля для работы с Коой (т.е. делает его таким образом Вы можете yield его), чтобы обернуть его в Promise:

function getProfile (access_token) { 
    return new Promise(function (resolve, reject) { 
    facebook.get('me') 
     .auth(access_token) 
     .request(function (err, res, body) { 
     if (err) return reject(err) 
     resolve(body) 
     }) 
    }) 
} 

router.get('/handle_facebook_callback', function * (next) { 
    const profile = yield getProfile(this.query.access_token) 
    this.type = 'application/json' 
    this.body = JSON.stringify(profile, null, 2) 
}) 

getProfile теперь возвращает Обещание, которое вы может уступить.

Также обратите внимание, что я изменил его так, чтобы getProfile разрешил объект профиля, а обработчик Koa - это тот, который сшивает this.body и JSON.

Как правило, вы хотите делать что-то в Коа, чтобы вся ваша мутация ответа происходила внутри обработчика в одном месте.

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

  • Нет связанных вопросов^_^