前言

之前学习过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

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

node.js express框架简介与实现的更多相关文章

  1. xcode6.1 – Xcode 6.1中项目模板中缺少类前缀

    项目模板上曾经有一个类前缀字段,这有助于区分项目类和框架类.Xcode6.1项目模板中不再提供此功能.这背后的意图是什么?

  2. ios – 伞框架

    错误.应用程序,通常位于…错误仍然存在你也可以在这里添加(子)框架的路径.

  3. ios – UIView框架大小的问题

    我正在开发一个iPad项目,目前正在使用Landscape视图.我试着这样做:为什么这总是返回960?虽然在景观中,视图本身的高度尺寸应为768对吗?

  4. 安装自定义cocoa框架的最佳方法

    我有一个自定义框架,遵循Apple的框架编程指南>>中的建议.Installingyourframework我在/Library/Frameworks中安装.我通过使用以下脚本添加RunScript构建阶段来完成此操作:在我的项目中,我然后链接/Library/Frameworks/MyFramework并将其导入我的类中,如下所示:这非常有效,除了我总是在调试器控制台中看到以下消息:Loadin

  5. ios – 在设备上构建和运行时,仅将嵌入式框架与其他动态框架链接失败

    TL;博士将您的嵌入式框架与其他框架链接,并且不将其他框架与您的应用程序链接,导致Build&在设备上运行.描述:建立:我的设置非常简单(Swift2.3&XcodeXcode8.0;Build版本8S162m):>使用Carthage(0.17.2)我用xcodebuild8.0和TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3carthagebui

  6. iOS 8嵌入式框架中的头文件

    我正在尝试创建一个用于iOS8的嵌入式框架.在创建一个名为SampleKit(BTW;这里有任何约定,我应该使用前缀吗?)之后,它包含一个令我困惑的头文件:我知道FOUNDATION_EXPORT是extern或extern“C”的宏,但我不确定这两个常量.我应该在哪里为他们设定价值?解决方法项目>构建设置>版本控制>当前项目版本:

  7. 在Monotouch上模拟.NET的框架?

    有没有人使用过他们发现与Monotouch兼容的.NET模拟框架?在尝试使用之前,我很好奇与NMock,NSubstitute,Moq和其他框架的兼容性.Xamarin刚刚加强了它的单元测试支持,但没有提到模拟框架.仅供参考,我希望在VS2010上为非UI位做很多开发,并在UI进入时移动到iOS平台.谢谢您的帮助.解决方法我建议只使用手动模拟:如果我不得不猜测RhinoMocks,Moq等大量使用Reflection.Emit(你怎么能做他们能做的疯狂?),这将无法在MonoTouch上使用AOT编译器运

  8. 在ios上使用来自框架的boost :: filesysystem路径

    我一直在使用Boost作为PeteGoodliffe脚本构建的框架已有一段时间了.效果很好.最近我遇到了一个问题,可以通过将以下代码放入另一个全新的XCode项目中的视图控制器的viewDidLoad中来重现:当路径对象被销毁时会导致EXC_BAD_ACCESS.有没有其他人遇到这个问题?

  9. ios – 在约束依赖于框架的自定义视图中使用自动布局

    我正在编写一个以编程方式初始化的自定义视图.我重写updateConstraints以添加此视图所需的所有约束.:问题是self.bounds返回CGRectZero的等价物.我做了我的研究并根据这个objc.ioarticle,这是预期的,因为在调用layoutSubviews之前框架不会被设置.它也提到了Toforcethesystemtoupdatethelayoutofaviewtreei

  10. ios – “禁用模块时使用’@import’”错误 – 启用模块和链接框架= YES

    我有一个使用CocoaPods并使用’SCLAlertView-Objective-C’窗格的项目.该pod使用@importUIKit;模块样式导入.我在目标和项目设置中将“启用模块(C&Objective-C)”和“自动链接框架”设置为YES.当模块被禁用时,我仍然得到“使用’@import’错误.有没有什么可以阻止Xcode能够启用模块,如使用.pch文件,任何链接器标志,或者我没有提到的任

随机推荐

  1. Error: Cannot find module ‘node:util‘问题解决

    控制台 安装 Vue-Cli 最后一步出现 Error: Cannot find module 'node:util' 问题解决方案1.问题C:\Windows\System32>cnpm install -g @vue/cli@4.0.3internal/modules/cjs/loader.js:638 throw err; &nbs

  2. yarn的安装和使用(全网最详细)

    一、yarn的简介:Yarn是facebook发布的一款取代npm的包管理工具。二、yarn的特点:速度超快。Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。超级安全。在执行代码之前,Yarn 会通过算法校验每个安装包的完整性。超级可靠。使用详细、简洁的锁文件格式和明确的安装算法,Yarn 能够保证在不同系统上无差异的工作。三、y

  3. 前端环境 本机可切换node多版本 问题源头是node使用的高版本

    前言投降投降 重头再来 重装环境 也就分分钟的事 偏要折腾 这下好了1天了 还没折腾出来问题的源头是node 使用的高版本 方案那就用 本机可切换多版本最终问题是因为nodejs的版本太高,导致的node-sass不兼容问题,我的node是v16.14.0的版本,项目中用了"node-sass": "^4.7.2"版本,无法匹配当前的node版本根据文章的提

  4. nodejs模块学习之connect解析

    这篇文章主要介绍了nodejs模块学习之connect解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. nodejs npm package.json中文文档

    这篇文章主要介绍了nodejs npm package.json中文文档,本文档中描述的很多行为都受npm-config(7)的影响,需要的朋友可以参考下

  6. 详解koa2学习中使用 async 、await、promise解决异步的问题

    这篇文章主要介绍了详解koa2学习中使用 async 、await、promise解决异步的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. Node.js编写爬虫的基本思路及抓取百度图片的实例分享

    这篇文章主要介绍了Node.js编写爬虫的基本思路及抓取百度图片的实例分享,其中作者提到了需要特别注意GBK转码的转码问题,需要的朋友可以参考下

  8. CentOS 8.2服务器上安装最新版Node.js的方法

    这篇文章主要介绍了CentOS 8.2服务器上安装最新版Node.js的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  9. node.js三个步骤实现一个服务器及Express包使用

    这篇文章主要介绍了node.js三个步骤实现一个服务器及Express包使用,文章通过新建一个文件展开全文内容,具有一定的参考价值,需要的小伙伴可以参考一下

  10. node下使用UglifyJS压缩合并JS文件的方法

    下面小编就为大家分享一篇node下使用UglifyJS压缩合并JS文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

返回
顶部