node使用request请求的方法


Posted in Javascript onDecember 20, 2019

近期使用node做服务端渲染,作为中间层需要请求后端接口,需要封装服务端的请求,接下来来了解下如何使用 request。

基本使用

const request = require('request')

引入这个包就可以开始使用了,最简单的使用方式就是 request(url) 就可以想指定的地址发起一个 get 请求。 从这里我们可以看出 request 暴露出来的就是一个函数。其实它内部的结构如下

function request (uri, options, callback) {
 if (typeof uri === 'undefined') {
 throw new Error('undefined is not a valid uri or options object.')
 }

 var params = initParams(uri, options, callback)

 if (params.method === 'HEAD' && paramsHaveRequestBody(params)) {
 throw new Error('HTTP HEAD requests MUST NOT include a request body.')
 }

 return new request.Request(params)
}

可以看出它默认接收三个函数,并且第一个参数值必须存在,request的传参方式也有很多种,本身做了很多支持的处理,来看看它支持的传参数方式。

入参格式

url 必填,可以单独放在第一个参数,或者作为 option 的属性之一。其他都是可选。

// 方式一
request(url,options,callback)
// 方式二
let options = {
 url // 必填
}
request(options,callback)

简写方式

// 方式一
request.get(url,options,callback)
// 方式二
let options = {
 url // 必填
}
request.get(options,callback)

// 方式一
request.post(url,options,callback)
// 方式二
let options = {
 url
}
request.post(options,callback)

为啥 request 支持这么多种传参数方式。来看看它内部的实现方式

源码

下面代码可以看出,request 对参数类型进行类型判断来采用不同的合并方式,最终 return 的params要求就是要包含url请求地址。

function initParams (uri, options, callback) {
 // 处理没有传 options 的情况
 if (typeof options === 'function') {
 callback = options
 }
 var params = {}
 if (typeof options === 'object') {
 extend(params, options, {uri: uri})
 // 传递的 url 最终也会被合并到 pramas 上
 // 并且如果你在 options 传递了 uri 会被第一参数覆盖,优先级以 第一个入参uri为准
 } else if (typeof uri === 'string') {
 extend(params, {uri: uri})
 } else {
 // 处理第一参数不是url的情况
 extend(params, uri)
 }

 params.callback = callback || params.callback
 return params
}

常用字段

request(options,callback) 提供 baseUrl 来统一设置域名部分及公共部分。

// 定义了 baseUrl 后只需要传递接口 api 即可
function fetchPost(path,params){
 return new Promise( (resolve,reject)=>{
 request.post(path,{
  baseUrl:"http://localhost:9000/react/",
 },function(err, httpResponse, body){
  if(err){
  reject(err)
  }else{
  resolve(body)
  }
 })
 })
}
// 使用,只传递了接口部分最终会拼接成 http://localhost:9000/react/c-request
router.get('/c-request',async ctx=>{
 let res = await fetchPost('request-header',{value:1,name:'dd'})
 ctx.body = res
})

reqeust 不同数据类型的请求及 debug

为了模拟node服务端请求后端的场景,启动两个node服务 ,一个作为请求方模拟(中间层),另一个作为后端。另外通过 postman 来发起客户端的请求。关于数据的验证可以使用 vscode 的 debug 功能 也可以开启 pm2 log 来验证请求的参数。

接下来看下 post 不同格式的请求方式的设置,不同与 axios , fetch 。request对于不同请求方式的数据接收的字段是不同的。可以通过 body、form、formData 来接收。get的请求都是通过 application/x-www-form-urlencoded 格式来传递数据的,所以这里暂不举例。

application/x-www-form-urlencoded

通过 forms字段 来接收入参,方法如下,直接将传入的参数对象传递给 form 即可。

function fetchPost(path,params){
 return new Promise( (resolve,reject)=>{
 request.debug = true
 request.post(path,{
  form:params
 },function(err, httpResponse, body){
  if(err){
  reject(err)
  }else{
  resolve(body)
  }
 })
 })
}

request 有个debug 模式,通过 request.debug = true 开启,为了查看debug信息,使用 pm2 start app.js --watch 启动项目,然后 pm2 log 来查看debug信息。红色代表中间层的log,绿色代表后端的log

node使用request请求的方法

使用 node debug 查看接收到的 request.body是后端接收到的值 request.header是接收到的请求 content-type

node使用request请求的方法

都会将入参传递到 body 这个字段上

form-data 文件上传

通过 formData 来传递文件,代码如下:使用 fs.createReadStream 去拿到中间层的文件,然后通过 formData 方式发送给后端。

function fetchPost(path,params){
 return new Promise( (resolve,reject)=>{
 let formData = {
  file:fs.createReadStream(__dirname+'/../static/images/icon-arrow.png')
 }
 request.debug = true
 request.post(path,{
  formData
 },function(err, httpResponse, body){
  if(err){
  reject(err)
  }else{
  resolve(body)
  }
 })
 })
}

可以看到后端接收到到 content-type 为 multipart/form-data , 我们并没有手动的去设置请求的 content-type 会自动添加上。

node使用request请求的方法

下面代码会将接收到到文件流写入到后端local。可以看到 icon-arrow.jpg 已经成功的从中间层发送到后端

node使用request请求的方法

application/json

将参数通过 body 传递,并且设置 json为ture,那么请求时会自动将 content-type 设置为 application/json 并且将传递给 body 的对象转义为 JSON

function fetchPost(path,params){
 return new Promise( (resolve,reject)=>{
 request.debug = true
 console.log('*'.repeat(40));
 request.post(path,{
  baseUrl:"http://localhost:9000/react/",
  body:params,
  json:true
 },function(err, httpResponse, body){
  if(err){
  reject(err)
  }else{
  resolve(body)
  }
 })
 })
}

node使用request请求的方法

header

request.post(path,{
 form:params,
 headers:{
 // 'content-type':'application/json',
 // ... 任意其他字段
 name:'dd',
 agent:'request'

 }
})

node使用request请求的方法

通过id号来区分当前进程,

node使用request请求的方法

可以通过 pm2 start app.js --name 请求端 来定义进程名称

node使用request请求的方法

最后

关于 reqeust 也是刚刚使用,有好的使用案例可以在评论区分享,值得优化的地方可以留言给我。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一样的table?不一样的table(可编辑状态table)
Sep 19 Javascript
关于jquery.validate1.9.0前台验证的使用介绍
Apr 26 Javascript
解析js原生方法创建表格效率测试
Jul 08 Javascript
深入理解javascript严格模式(Strict Mode)
Nov 28 Javascript
微信浏览器内置JavaScript对象WeixinJSBridge使用实例
May 25 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
Oct 12 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
May 10 Javascript
用JS实现轮播图效果(二)
Jun 26 Javascript
jquery 实现复选框的全选操作实例代码
Jan 24 Javascript
浅谈vue.js导入css库(elementUi)的方法
Mar 09 Javascript
vue element table 表格请求后台排序的方法
Sep 28 Javascript
JS图片预加载三种实现方法解析
May 08 Javascript
Vue filter 过滤当前时间 实现实时更新效果
Dec 20 #Javascript
使用JavaScript计算前一天和后一天的思路详解
Dec 20 #Javascript
js正则匹配多个全部数据问题
Dec 20 #Javascript
微信小程序按顺序同步执行的两种方式
Dec 20 #Javascript
Vuex实现数据共享的方法
Dec 20 #Javascript
React 实现车牌键盘的示例代码
Dec 20 #Javascript
jquery实现商品sku多属性选择功能(商品详情页)
Dec 20 #jQuery
You might like
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
2012/07/31 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
yii,CI,yaf框架+smarty模板使用方法
2015/12/29 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
基于laravel缓冲cache的用法详解
2019/10/23 PHP
fromCharCode和charCodeAt 方法
2006/12/27 Javascript
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
jQuery oLoader实现的加载图片和页面效果
2015/03/14 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
2015/11/05 Javascript
从零开始做一个pagination分页组件
2017/03/15 Javascript
Angualrjs和bootstrap相结合实现数据表格table
2017/03/30 Javascript
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
2017/07/27 Javascript
提高Node.js性能的应用技巧分享
2017/08/10 Javascript
vue+vuex+axios实现登录、注册页权限拦截
2018/03/09 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
JavaScript使用canvas绘制随机验证码
2020/02/17 Javascript
vue中渲染对象中属性时显示未定义的解决
2020/07/31 Javascript
python好玩的项目—色情图片识别代码分享
2017/11/07 Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
2018/01/29 Python
python 文件转成16进制数组的实例
2018/07/09 Python
示例详解Python3 or Python2 两者之间的差异
2018/08/23 Python
浅谈python连续赋值可能引发的错误
2018/11/10 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
2019/12/04 Python
关于Python中定制类的比较运算实例
2019/12/19 Python
python+selenium+Chrome options参数的使用
2020/03/18 Python
python读取mysql数据绘制条形图
2020/03/25 Python
基于pycharm 项目和项目文件命名规则的介绍
2021/01/15 Python
基于HTML5的WebSocket的实例代码
2018/08/15 HTML / CSS
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
澳大利亚头发和美容产品购物网站:OZ Hair & Beauty
2020/03/27 全球购物
值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型
2015/10/24 面试题
大学生职业生涯规划书参考模板
2014/03/05 职场文书
合作意向书范本
2014/03/31 职场文书
幼儿园大班区域活动总结
2014/07/09 职场文书
部队个人年终总结
2015/03/02 职场文书