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 相关文章推荐
参考:关于Javascript中实现暂停的几篇文章
Mar 04 Javascript
客户端 使用XML DOM加载json数据的方法
Sep 28 Javascript
js实现的切换面板实例代码
Jun 17 Javascript
jquery数组封装使用方法分享(jquery数组遍历)
Mar 25 Javascript
浅析javascript中function 的 length 属性
May 27 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
Jan 28 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
Sep 20 Javascript
预防网页挂马的方法总结
Nov 03 Javascript
浅谈Node.js:Buffer模块
Dec 05 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
May 12 Javascript
layui清除radio的选中状态实例
Nov 14 Javascript
JS实现简易计算器
Feb 14 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开源建站平台小结
2010/04/22 PHP
PHP使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
PHP脚本自动识别验证码查询汽车违章
2016/12/20 PHP
让iframe自适应高度(支持XHTML,支持FF)
2007/07/24 Javascript
分享20款好玩的jQuery游戏
2011/04/17 Javascript
JavaScript高级程序设计 错误处理与调试学习笔记
2011/09/10 Javascript
基于jquery的文本框与autocomplete结合使用(asp.net+json)
2012/05/30 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
window.onload与$(document).ready()的区别分析
2015/05/30 Javascript
详解JavaScript编程中正则表达式的使用
2015/10/25 Javascript
jQuery实用技巧必备(中)
2015/11/03 Javascript
js判断输入字符串是否为空、空格、null的方法总结
2016/06/14 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
基于JavaScript实现移动端无限加载分页
2017/03/27 Javascript
js匿名函数使用&传参(实例)
2017/09/08 Javascript
Node.js学习教程之HTTP/2服务器推送【译】
2017/10/31 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
vue-cli3 取消eslint校验代码的解决办法
2020/01/16 Javascript
vue学习笔记之作用域插槽实例分析
2020/02/01 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
在vue中使用eslint,配合vscode的操作
2020/11/09 Javascript
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
[46:42]DOTA2-DPC中国联赛正赛 Aster vs Magma BO3 第二场 3月5日
2021/03/11 DOTA
Python原始字符串(raw strings)用法实例
2014/10/13 Python
Python中int()函数的用法浅析
2017/10/17 Python
python selenium自动上传有赞单号的操作方法
2018/07/05 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
在Python中使用MySQL--PyMySQL的基本使用方法
2019/11/19 Python
Python3自动生成MySQL数据字典的markdown文本的实现
2020/05/07 Python
英国百年闻名的优质健康产品连锁店:Holland & Barrett
2019/12/19 全球购物
补充协议书范本
2014/04/23 职场文书
骨干教师申报材料
2014/12/17 职场文书
小学见习报告
2015/06/23 职场文书
创业计划书之家教中心
2019/09/25 职场文书
Win11如何修改dns?Win11修改dns图文教程
2022/01/18 数码科技