鍍金池/ 問答/HTML/ node 作為中間層調(diào)后臺api,拿到結(jié)果之后如何返回給瀏覽器?

node 作為中間層調(diào)后臺api,拿到結(jié)果之后如何返回給瀏覽器?

領(lǐng)導要求要是用node作為中間層,去請求后端的api,node層使用了koa2(2.5.1)框架,用來向瀏覽器端提供接口,但在后臺沒開發(fā)完成的時候作為測試返回一些死數(shù)據(jù)就正常,但是當接入了后端api的時候就返回不了了,瀏覽器端http狀態(tài)碼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)  // 有數(shù)據(jù)
  console.log('數(shù)據(jù)是', ctx.request.body) // 有數(shù)據(jù)
  console.log('賬號', ctx.request.body.name, '密碼', ctx.request.body.password) // 有數(shù)據(jù)
    ctx.body = {  // 最開始為了測試,只要點用了這個login接口就會返回這個數(shù)據(jù)是正常的,后面會注釋
     code: 200,
     msg: 'success'
   }
/*
* 但是當我在這個里面接入了request模塊之后就出問題了
* 代碼如下
*/
   request({
    url: 'http://xxx.55.41.71:9090/tokens',
    method: "POST",
    json: true,  // 照搬網(wǎng)上一個例子,這個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  // 這邊就是一直返回不出去,瀏覽器一直報錯
    }
  })
})

如圖
圖片描述

圖片描述

如果當我瀏覽器調(diào)用node層需要,node層的接口需要訪問三個接口,分別為A,B,C 只有當A,B C三個接口都拿到數(shù)據(jù)了才能返給瀏覽器(假設沒有依賴關(guān)系),有沒有類似于all的方法?

回答
編輯回答
殘淚

你在requrest的回調(diào)里設置ctx.body,回調(diào)的時候請求已經(jīng)返回了。

你應該用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。

2017年5月2日 16:56
編輯回答
吢丕
ctx.response.status = 200 // 加這個試試
ctx.body = {
 ... 
}
2017年7月30日 15:32