node.js express框架简介与实现
作者:挑战者V 发布时间:2024-05-08 09:35:22
前言
之前学习过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,模拟那些服务器,提供数据进行联调和测试
四、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
来源:https://www.cnblogs.com/youcong/p/10422352.html
猜你喜欢
- 关于mysql效率优化一般通过以下两种方式定位执行效率较低的sql语句。通过慢查询日志定位那些执行效率较低的 SQL 语句,用 --log-
- git fetch和git pull都可以将远端仓库更新至本地那么他们之间有何区别?想要弄清楚这个问题有有几个概念不得不提。FETCH_HE
- 一、TensorFlow介绍1、简介 TensorFlow是一个基于数据流编程(dataflow programming)的符号数学系统,
- 为了自定义一个模板标签,你需要告诉Django当遇到你的标签时怎样进行这个过程。当Django编译一个模板时,它将原始模板分成一个个 节点
- 本文实例讲述了Python实现的井字棋(Tic Tac Toe)游戏。分享给大家供大家参考,具体如下:说明用python实现了井字棋,整个框
- 本文涵盖了一个简单的C实现的搜索引擎的搭建始末。我通常使用SQL Server和C #,但我教C/C++的朋友要远离微软。在过去
- 一、思路介绍在已有的单路径迷宫基础上打开一块合适的墙就可以构成2路径的迷宫。打开的墙不能和已有的路径过近。1。从开始和终点开始进行广度优先搜
- 相信每一个 javascript 学习者,都会去了解 JS 的各种基本数据类型,数组就是数据的组合,这是一个很基本也十分简单的概念,他的内容
- 但是我们可以换一种方法解决这个问题。下面就来分析下解决办法。对text或ntext类型的数据在查询中不能进行字符串操作。这时用得最多的是把t
- String str = "n1e你v00a?Az$Z000?#99?9900眯2_悄s3你y4@好?!6求救你d75a8t&qu
- 每次抽取后都重新洗牌。计算10000次随机抽取可得到同花的几率。我做的比较复杂,分别累计了四种花色分别出现了几次import randoml
- 前言本文主要给大家介绍了关于Python利用元组代替字典并为元组元素命名的相关内容,下面话不多说了,来一起看看详细的介绍吧场景:一般使用字典
- 前言在微信小程序开发中,navigator 用来实现页面路由功能,比如 A页面 中点击页面打开B页面1 navigator 默认方式打开新的
- 一、下载1、官网下载2、某度网盘下载链接: https://pan.baidu.com/s/1BgbZH-aFaJ1nwm2PpDeOSQ?
- 最近学习javascript,碰到caller和callee的问题,去网上百度了很多。搜到的内容大同小益,整理总结了一下与大家分享。call
- 前言近来chatGPT挺火的,也试玩了一下,确实挺有意思。这里记录一下在Python中如何去使用chatGPT。本篇文章的实现100%基于
- --建递增序列CREATE SEQUENCE LZEAM_SP_LOOP_EQ_SEQ MINVALUE 1 INCREMENT BY 1
- cvtColor函数这个函数有两个参数1,src 要进行变换的原图像2,code 转换代码标识例子:import cv2image=cv2.
- 实战场景本篇博客为大家介绍一款新的自动化测试工具,效果类似 selenium,但是这个模块年轻。模块名称为 playwright-pytho
- 目录什么是信号Python的信号处理Python对信号的处理信号枚举信号函数signal.alarm(time)signal.pause()