2016-08-05 2 views
0

おそらくJSについて何か分かりませんが、ページ本体にPurestレスポンスを書く際に問題が発生しています。ここのように:KOAのPurestリクエスト

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それをできるようすなわちそれを作る)で動作するように、コールバック形式の関数を取得するための一般的な解決策は約束でそれをラップすることです:

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での処理をどのようにして、すべての応答突然変異がハンドラ内で1か所で起こるようにする方法です。

関連する問題