1

我目前正在尝试实现 BFF(前端架构的后端)。

使用request-promise库我可以成功命中其他微服务,但无法将结果作为 BFF 微服务的响应返回。

每次它返回这个结果Promise { pending }挂起状态时,有人可以帮我解决这个问题吗?

我的主要问题是知道如何从我们正在命中的另一个微服务将数据接收到 BFF 微服务中,并从正在命中另一个微服务的微服务返回结果。

或者如果有人可以帮助我知道如何从.then任何承诺内部访问结果?

流程是这样的:

client(ios/android)===(sends request)==>BFF Microservice==>BP microservice

(BFF 微服务处理请求并根据从其他微服务收到的结果返回响应)

调用另一个微服务的微服务代码:

import yagmodel from '../../lib/models/yag-model'
import {errorsList} from '../../lib/errors/errorsList'
import request from 'request-promise'
import config from 'config'

//template below to call the REST APIs of other microservices.

export async function getAllBP (req,res) {
    let yagresponse// this varaible is defined to get data from inside(rs.then )

    const username= req.swagger.params.username.value
    const authheader= req.swagger.params.Authorization.value
    console.log("Authorization:"+authheader)

    let rs= await yagmodel.bp(username,authheader)
    console.log(rs)

    rs.then((response)=>{
        // console.log(response.body)
        yagresponse=response.body
        //console.log(rsp)
    }).catch((err)=>{
        console.log(err)
        console.log('errorstatuscode:'+err.statusCode)
    })

    res.status(200).send(yagresponse) 
}

yag-model.js代码:

import {errorsList} from '../../lib/errors/errorsList'
import request from 'request-promise'

module.exports.bp = async function getBP(username,authheader){
    const options={
        uri: `http://localhost:4000/Health/BP/`+username,
        json: true,
        resolveWithFullResponse: true,
        headers: {
            'Content-Type': 'application/json; charset=utf-8',
            'Accept': 'application/json; charset=utf-8',
            'Authorization':authheader
        },
        method: 'GET'
    }

    return request(options).then ((response)=>{
        return response.body        
    }).catch((err)=>{
        console.log(err)
        console.log('errorstatuscode:'+err.statusCode)
    })
}
4

3 回答 3

1

我认为当您只能使用 await 时,您可以将 await 运算符与 promise 混合使用。

我创建了您的代码的简化版本:

yag-model.js

const request = require('request-promise');

module.exports.bp = async function getBP () {

    const options = {

        uri: `https://api.postcodes.io/random/postcodes`,
        json: true,
        resolveWithFullResponse: true,
        method: 'GET'
    };

    return request(options).then((response) => {

        return response.body

    }).catch((err) => {
        console.log(err);
        console.log('errorstatuscode:' + err.statusCode)
    })
};

和样本中的 usgaebf.js

const yagmodel = require('./yag-model');

async function getAll(){
    const result = await yagmodel.bp();
    console.log(result);
};

getAll();

结果是我的控制台上的响应。

F:\Projekty\Learn\lear-node>node bf
{ status: 200,
result:
 { postcode: 'BH23 5DA',
   quality: 1,
   eastings: 420912,

我建议查看来自 Axel Rauschmayer 博士的关于 asunc 函数的优秀资源http://exploringjs.com/es2016-es2017/ch_async-functions.html

于 2017-07-07T09:01:31.547 回答
0

请不要混淆从 request-promise 和 async 函数返回的承诺。可以await使用 async 函数来获得已解决的承诺并使您的代码看起来不错。

我相信让人们解决他们自己的问题并引导他们一路走来,这样只是为了确保,你没有从你的这一行中的已解决承诺中获得回报:

console.log(rs)

此外,通过查看您的代码段,您将从 request-promise 的 thenable 中返回一个 response.body。您无法从响应正文中捕获任何响应错误,对吗?

我强烈建议遵循一种模式,在这种模式下,你会捕获错误(你应该在哪里)并在你这样做时显示正确的消息。将您的 await 调用包装在 try/catch 中可以帮助从 request-promise 中捕获未捕获的错误。

和平!

于 2017-07-07T09:39:44.323 回答
0

您有两个承诺,然后您可以使用两个 await 来解决它们。

export async function getAllBP (req,res) {
    let yagresponse// this varaible is defined to get data from inside(rs.then )

    const username= req.swagger.params.username.value
    const authheader= req.swagger.params.Authorization.value
    console.log("Authorization:"+authheader)

    let rs= await yagmodel.bp(username,authheader)
    console.log(rs)

    let response= await rs()

    res.status(200).send(response);
}
于 2019-02-08T04:38:04.653 回答