node.js express框架简介与实现


Posted in Javascript onJuly 23, 2019

前言

之前学习过node.js接触过express框架,最近为了编写一个mock server正好用到了express。下面正好就跟大家介绍一下关于express。

今天的内容主要围绕这么几个方面?

  • express框架初步介绍
  • express框架中的app.use和app.get/app.post
  • mock server 介绍
  • mock server的实现思路

一、express框架初步介绍

关于express框架的介绍,这里我引用菜鸟教程的简介:

Express是一个简洁而灵活的node.js web框架,提供了一系列强大特性帮助你创建各种web应用,和丰富的HTTP工具。使用Express可以快速地搭建一个完整功能的网站。

1.express框架的特性

  • (1)可以设置中间件来响应HTTP请求;
  • (2)定义了路由表用于执行不同大的HTTP请求动作;
  • (3)可以通过向模板传递参数来动态渲染HTML页面;

2.安装express

npm install express --save或cnpm install express --save

以下几个重要需要与express框架一起安装:

  • body-parser -node.js中间件,用于处理JSON,Raw,Text和URL编码的数据;
  • cookie-parser -这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并将它们转为对象;
  • multer - node.js中间件,用于处理enctype=“multipart/form-data”(设置表单mime编码)的表单数据;

安装命令如下所示:

npm install body-parser --save
npm install cookie-parser --save
npm install multer --save

3.express的入门程序

node_learning.js代码如下:

var express = require('express');
var app = express();

app.get('/', function (req, res) {
 res.send('Hello World');
})

var server = app.listen(2019, function () {

 var host = server.address().address
 var port = server.address().port

 console.log("应用实例,访问地址为 http://127.0.0.1:2019", host, port)

})

二、express框架中的app.use和app.get/app.post

app.use和app.get/app.post其实区别如(引用一位朋友说的):

感兴趣的可以参考这个链接:作者做了试验测试过的

(1)app.use(path,callback)中的callback既可以是router对象又可以是函数

(2)app.get(path,callback)中的callback只能是函数

app.use和app.get/app.post实现几乎大同小异,代码示例如下:

var express = require('express');
var app = express();
function testUser(req, res, next){
 // req 参数可以接受一些请求的参数(req.query/req.body) 和 请求头信息
 // res 用于响应信息
 // 调用next()方法则进入下一个中间件
 res.send("测试用户");
}

function testLogin(req,res,next){
 res.send("测试登录");
}

var server = app.listen(2019, function () {
 var host = server.address().address
 var port = server.address().port
 console.log("应用实例,访问地址为 http://127.0.0.1:2019")
})

//路径匹配

app.use('/user',testUser);
app.get('/login',testLogin);

关于node.js的express框架就介绍这么多,最近本人因实现某个插件的功能而需要用到的,这与下面说的mock server有比较大的关系。

三、mock server 介绍

mock server 翻译过来的意思是模拟服务。

说到这我相信大家就很容易理解了。至于为什么要模拟服务?

比方说现今的业务系统很少有孤立存在的,它们或多或少使用其他公司提供的服务,这给我们联调和测试造成了比较大的麻烦,对于这种情况,常见的解决方案就是搭建一个mock server,模拟那些服务器,提供数据进行联调和测试

node.js express框架简介与实现

四、mock server的实现思路

现在google或者being搜索mock server 实现思路肯定有很多,这里我就不再赘述。

这里我以我自己最近的vscode插件开发来说。

我最近的工作是针对Settings-Sync作二次开发

关于settings-sync插件,感兴趣的可以参考我的博客园Settings-Sync源码阅读

如何实现一个mock server 替换github api地址并确保效果一致?

针对目前这个需求,我的实现思路如下:

  • 第一,针对如何实现一个mock server ,可以复用已有,如mock-github-api(其本身是使用node.js的express框架);
  • 第二,如何编写,可以按照express框架编写网络请求的方法,如app.get或app.use等;
  • 第三,为了保持与githu api一致,我需要引入github rest api,如@octokit/rest;

参考api地址

示例一:
  octokit.repos.listForOrg({
  org: 'octokit',
  type: 'public'
 }).then(({ data, status, headers }) => {
  // handle data
  //console.log("status:"+JSON.stringify(headers));
  //console.log(status);
  console.log(data);
 })
 返回的octokit相关的api信息(信息太多了,就先简略)
示例二:
 const clientWithAuth = new Octokit({
 auth: 'token secret123'
 })
 console.log(clientWithAuth)//查看详细信息
 console.log(JSON.stringify(clientWithAuth))//输出简要信息如下
 所示:
 返回的信息:
 {"log":{},"activity":{},"apps":{},"checks":{},"codesOfConduct":{},"emojis":{},
 "gists":{},"git":{},"gitignore":{},"interactions":{},"issues":{},"licenses":{},
 "markdown":{},"meta":{},"migrations":{},"oauthAuthorizations":{},"orgs":{},
 "projects":{},"pulls":{},"rateLimit":{},"reactions":{},"repos":{},"search":{},
 "teams":{},"users":{},"gitdata":{},"authorization":{},"pullRequests":{}
 }

第四,根据router.json(node_modules\@octokit\rest\plugins\rest-api-endpoints\routes.json)也就是octokit里面定义github rest api的地方(该文件定义了所需的所有的请求信息),我可以仿照其编写对应的网络请求(美其名依样画葫芦);

如果要用一句简单直接的话来概述,模仿github rest api编写一个mock server来替换github,只要接口定义保持一致就可以。
但是目前存在一个问题,我在此停滞不前。正在想办法解决这个问题。

这个问题是,我参考其对应的rest api文档写代码,但是其返回的信息却并没有我想要的,返回是一大堆没有用处的function之类的,而不是具体的信息。

但是以5why原则来看待这个问题:

为什么github api会返回一大堆function?

这些function有什么用?github api不会无缘无故返回没有用的东西

还有就是为什么console.log(clientWithAuth)返回详细信息,console.log(JSON.stringify(clientWithAuth))返回的却是简要信息呢?难道是因为非JSON数据吗?两者返回的都是JSON数据

我查找JSON.stringify()认为应该是这个原因:

JSON.stringify() 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串,如果指定了replacer是一个函数,则可以替换值,或者如果指定了replacer是一个数组,可选的仅包括指定的属性(参考地址)

另外前面虽说不讲mock server的实现思路,但是还是要推荐一下一个开源实现框架 moco。

github仓库地址为:https://github.com/dreamhead/moco

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

Javascript 相关文章推荐
Use Word to Search for Files
Jun 15 Javascript
JavaScript 基础知识 被自己遗忘的
Oct 15 Javascript
JS判断是否为数字,是否为整数,是否为浮点数的代码
Apr 24 Javascript
javascript 构造函数强制调用经验总结
Dec 02 Javascript
Dom 学习总结以及实例的使用介绍
Apr 24 Javascript
jQuery Ajax中的事件详细介绍
Apr 16 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
Oct 25 Javascript
15款最好的Bootstrap在线编辑器
Aug 03 Javascript
js 判断附件后缀的简单实现方法
Oct 11 Javascript
基于JQuery的购物车添加删除以及结算功能示例
Mar 08 Javascript
vue 指令之气泡提示效果的实现代码
Oct 18 Javascript
Three.js实现简单3D房间布局
Dec 30 Javascript
js微信分享接口调用详解
Jul 23 #Javascript
详解vue-cli项目开发/生产环境代理实现跨域请求
Jul 23 #Javascript
vue 地区选择器v-distpicker的常用功能
Jul 23 #Javascript
微信小程序 网络通信实现详解
Jul 23 #Javascript
微信小程序 确认框的实现(附代码)
Jul 23 #Javascript
koa2 从入门到精通(小结)
Jul 23 #Javascript
详解JavaScript 浮点数运算的精度问题
Jul 23 #Javascript
You might like
php cookis创建实现代码
2009/03/16 PHP
php实现webservice实例
2014/11/06 PHP
php导入excel文件到mysql数据库的方法
2015/01/14 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
Yii 访问 Gii(脚手架)时出现 403 错误
2018/06/06 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
tp5框架的增删改查操作示例
2019/10/31 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
JavaScript 快捷键设置实现代码
2009/03/13 Javascript
js制作的鼠标悬浮时产生的下拉框效果
2012/10/27 Javascript
javascript中encodeURI和decodeURI方法使用介绍
2013/05/06 Javascript
js字符串截取函数substr substring slice使用对比
2013/11/27 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
JavaScript实现无穷滚动加载数据
2017/05/06 Javascript
JS实现的判断方法、变量是否存在功能示例
2020/03/28 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
2018/05/22 Javascript
微信小程序实现带缩略图轮播效果
2018/11/04 Javascript
微信小程序时间控件picker view使用详解
2018/12/28 Javascript
Vue中通过属性绑定为元素绑定style行内样式的实例代码
2020/04/30 Javascript
JavaScript函数重载操作实例浅析
2020/05/02 Javascript
Python callable()函数用法实例分析
2018/03/17 Python
python中字符串变二维数组的实例讲解
2018/04/03 Python
python的concat等多种用法详解
2018/11/28 Python
解决python有时候import不了当前的包问题
2019/08/28 Python
Python 类属性与实例属性,类对象与实例对象用法分析
2019/09/20 Python
Python基于pygame实现单机版五子棋对战
2019/12/26 Python
解决python调用自己文件函数/执行函数找不到包问题
2020/06/01 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
CSS3实现超慢速移动动画效果非常流畅无卡顿
2014/06/15 HTML / CSS
纪检监察建议书
2014/05/19 职场文书
小学生植树节活动总结
2014/07/04 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
湖南省党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
小学毕业感言200字
2015/07/30 职场文书
JPA如何使用entityManager执行SQL并指定返回类型
2021/06/15 Java/Android