node中间层请求后端的服务,request-promise-native模块为何await拿不到数据

发布于 2022-09-07 11:59:11 字数 2176 浏览 19 评论 0

硬着头皮用node做中间层请求服务端,大神请轻喷。项目情况如下:

  1. node版本8.11.2,使用了koa2版本2.5.1
  2. 因为需要用node服务器去请求后端的api,所以使用了request模块
  3. 使用了koa2-cors包(2.0.5)作为跨域的处理
  4. 使用了koa-router(7.1.1)
// 假设这边有一个login的接口
const request = require('request')
router.post('/login', async (ctx, next) => {
  ctx.body = {  // 可以给浏览器返回对应的数据,在自己独立开发的时候没有任何问题
    code: 200,
    msg: 'success'
   }  
})
// 当需要连调的时候就出问题了
router.post('/login', async (ctx, next) => {
    // 一些校验之类的方法
    
   // 在这里面需要调用后端的api了 ,例如
    request({
    url: 'http://xx.55.41.71:9090/tokens',
    method: "POST",
    json: true,
    headers: {
      "content-type": "application/json",
    },
    body: JSON.stringify({
      'userName': 'xxxxxx',
      'password': 'xxxxxx'
    })
  }, function (error, response, body) {
    if (!error && response.statusCode == 200) {
      console.log(body)  // 在这里可以拿到服务器的返回值
      ctx.body = body  // 但这样给浏览器返回数据就会出错,在大神的指点下使用 request-promise-native
    }
  })
    
})

关于上面的这个,想看详细的信息可以参考链接

问题描述

//现在将request模块替换为request-promise-native
// const request = require('request')  // 注释掉request  
// 但是我看request-promise-native的npm需要install requese --save 
// demo例子却没有require('requese') 那又为何要npm install requese --save 呢?
 const request = require('request-promise-native')
// 将代码改为如下
let res = await request({
    url: 'http://120.55.41.71:9090/tokens',
    method: "POST",
    headers: {
      "content-type": "application/json",
    },
    body: JSON.stringify({
      'userName': ctx.request.body.name,
      'password': ctx.request.body.password
    })
  })
  ctx.body = res

node 报错如下
图片描述

图片描述

图片描述

因为时间比较晚,我暂时不能确定后端的错误导致了我的错误(因为刚用postman调用发现有点问题但又不能确定),所以感觉是我node弄错了
希望来个大神说下是什么错误?最好能给一个request-promise-native的demo例子,看github的官方文档,英文看的一知半解。看官方还有request-promise(貌似需要一个其他的插件支持下)request-promise-native(原生实现,可以不用)request-promise-any(貌似也需要一个支持)。这几个哪个好用?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

随心而道 2022-09-14 11:59:11

自己基于promise封装一下就行了,不用什么都依赖于第三方包。

router.post('/login', async (ctx, next) => {
  const options = {
    url: 'http://xx.55.41.71:9090/tokens',
    method: "POST",
    json: true,
    headers: {
      "content-type": "application/json",
    },
    body: JSON.stringify({
      'userName': 'xxxxxx',
      'password': 'xxxxxx'
    })
  };
  ctx.body = await requestPromise(options);
});

// promise 是异步流程控制的基础,自已封装一下就行了
function requestPromise (options) {  
  return new Promise((resolve, reject) => {
    request(options, (error, response, body) => {
      if (error) {
        reject(error);
      }
      resolve(body);
    })
  })
}

或者更简单一点,直接用原生的 promisify :

const util = require('util');
const request = require('request');
const requestPromise = util.promisify(request);

router.post('/login', async (ctx, next) => {
  const options = {
    url: 'http://xx.55.41.71:9090/tokens',
    method: "POST",
    json: true,
    headers: {
      "content-type": "application/json",
    },
    body: JSON.stringify({
      'userName': 'xxxxxx',
      'password': 'xxxxxx'
    })
  };

  const {response, body} = await requestPromise(options);
  ctx.body = body;
});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文