如何从您的节点微服务调用其他 REST API 并将结果作为响应发送?

How to call other REST APIs from your node micro-service and send the result as a response?

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

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

每次都是 return 这个结果 Promise { pending } 待定状态,有人可以帮我解决这个问题吗?

我的主要问题是知道如何从我们正在访问的另一个微服务接收数据到 BFF 微服务,并return从正在访问另一个微服务的微服务获取结果。

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

流程是这样的:

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

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

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

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)
    })
}

我认为当你只能使用 await 时,你可以混合使用 promises 来匹配 await oprators。

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

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)
    })
};

样本中的 usgae bf.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

请不要混淆 return 从请求-承诺和异步函数中编辑的承诺。 异步函数可以 awaited 以获得已解决的承诺并使您的代码看起来不错。

我相信让人们解决他们自己的问题并引导他们一路走来,所以只是为了确保,你不是从你这行中已解决的承诺中得到 return 吗:

console.log(rs)

此外,通过查看您的代码段,您正在从请求承诺的 thenable 中 returning response.body。您无法从响应正文中捕获任何响应错误,对吗?

我强烈建议您遵循一种模式,在这种模式下您会发现错误(在您应该发现的地方)并在您发现错误时显示正确的消息。将您的 await 调用包装在 try/catch 中有助于捕获请求承诺中未捕获的错误。

和平!

你有两个promise,那么你可以用两个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);
}