我可能对JS不太了解,但是在编写对页面正文的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);
})
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){
facebook.get('me')
.auth(access_token)
.request(function (err, res, body) {
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(body,null,2);”部件应将响应写到身体中,但事实并非如此。
这到底是什么问题?
最佳答案
路由(生成器)没有等待getProfile
完成。您需要yield
。
现在,在您的代码段中,它执行getProfile
,它立即返回到生成器,生成器完成,Koa看到您尚未设置this.body
,因此默认为404响应。
一旦getProfile
中的回调最终在以后的某个时刻触发,则响应已发送,您会收到错误消息。
使回调样式函数与Koa配合使用的一般解决方案(即使其可以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缝合在一起的处理程序。通常,这就是您想要在Koa中进行操作的方式,以便您所有的响应突变都可以在处理程序内部集中在一个地方。