node 作为中间层调后台api,拿到结果之后如何返回给浏览器?

领导要求要是用node作为中间层,去请求后端的api,node层使用了koa2(2.5.1)框架,用来向浏览器端提供接口,但在后台没开发完成的时候作为测试返回一些死数据就正常,但是当接入了后端api的时候就返回不了了,浏览器端http状态码404。硬着头皮使用node作为中间层,望大神轻喷。代码如下

// node版本8.11.2
// router使用koa-router(7.1.1)
// 有使用 koa2-cors包作为跨域的处理
// node端http请求使用request(2.87.0)
router.post('/login', async (ctx, next) => {
  console.log('方式是', ctx.request)  // 有数据
  console.log('数据是', ctx.request.body) // 有数据
  console.log('账号', ctx.request.body.name, '密码', ctx.request.body.password) // 有数据
    ctx.body = {  // 最开始为了测试,只要点用了这个login接口就会返回这个数据是正常的,后面会注释
     code: 200,
     msg: 'success'
   }
/*
* 但是当我在这个里面接入了request模块之后就出问题了
* 代码如下
*/
   request({
    url: 'http://xxx.55.41.71:9090/tokens',
    method: "POST",
    json: true,  // 照搬网上一个例子,这个true是代表什么意思?
    headers: {
      "content-type": "application/json",
    },
    body: JSON.stringify({
      'userName': ctx.request.body.name,
      'password': ctx.request.body.password
    })
  }, function (error, response, body) {
    if (!error && response.statusCode == 200) {
      console.log(body)  // 这边在控制台上是可以拿到这个body的
      ctx.body = body  // 这边就是一直返回不出去,浏览器一直报错
    }
  })
})

如图
图片描述

图片描述

如果当我浏览器调用node层需要,node层的接口需要访问三个接口,分别为A,B,C 只有当A,B C三个接口都拿到数据了才能返给浏览器(假设没有依赖关系),有没有类似于all的方法?

阅读 3.6k
2 个回答

你在requrest的回调里设置ctx.body,回调的时候请求已经返回了。

你应该用async/await,类似这样:

const request = require('request-promise-native');
const Koa = require('koa');

const app = new Koa();

app.use(async ctx => {
    let res = await request("https://www.mocky.io/v2/5185415ba171ea3a00704eed")
    ctx.body = res
});

app.listen(3000);

request有promise封装:request-promise-native

ctx.response.status = 200 // 加这个试试
ctx.body = {
 ... 
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题