首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KOA中最纯粹的请求

KOA中最纯粹的请求
EN

Stack Overflow用户
提问于 2016-08-05 21:14:59
回答 1查看 155关注 0票数 0

我可能对JS不太了解,但我在向页面主体编写最纯粹的响应时遇到了问题。如下所示:

代码语言:javascript
复制
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);“部分应该将响应写到主体中,但是它没有。

EN

回答 1

Stack Overflow用户

发布于 2016-08-14 20:54:26

路由(生成器)不会等待getProfile完成。你需要yield

现在,在您的代码片段中,它执行getProfile,后者立即返回到生成器,生成器结束,Koa看到您尚未设置this.body,因此它默认为404响应。

一旦getProfile中的回调最终在稍后触发,响应就已经发送,您会得到错误。

让回调风格的函数与Koa一起工作的一般解决方案是将其包装在Promise中(例如,使其可以yield它):

代码语言:javascript
复制
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使用profile对象进行解析,并且Koa处理程序是将this.body和JSON缝合在一起的处理程序。

这通常是你想要在Koa中做事情的方式,这样你所有的响应变化就会发生在处理程序内部的一个地方。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38790239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档