2016-08-05 199 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,它立即返回到發生器,發電機完成,Koa發現你沒有設置this.body,所以它默認爲404響應。

一旦getProfile的回調最終在稍後的某個點觸發,響應已發送並且您收到錯誤。

爲得到一個回調風格的功能與興亞工作(即做,所以你可以yield吧)一般的解決方法是將其包裝在一個承諾:

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拼合在一起的處理程序。

這通常是您想如何在Koa中做的事情,以便您的處理器中的所有響應突變發生在一個地方。