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

四、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地址为:https://www.npmjs.com/package/@octokit/rest#authentication

示例一:
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是一个数组,可选的仅包括指定的属性(参考地址为:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)

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

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

node.js之express框架的更多相关文章

  1. node.js使用express框架进行文件上传

    关于node.js使用express框架进行文件上传,主要来自于最近对Settings-Sync插件做的研究.目前的研究算是取得的比较好的进展.Settings-Sync中通过快捷键上传文件,其实主要 ...

  2. Node.js基于Express框架搭建一个简单的注册登录Web功能

    这个小应用使用到了node.js  bootstrap  express  以及数据库的操作 :使用mongoose对象模型来操作 mongodb 如果没了解过的可以先去基本了解一下相关概念~ 首先注 ...

  3. node.js之express框架入门篇

    一.express框架简介 express框架是后台的Node框架,在后台的受欢迎的程度,和jQuery一样 英语官网:http://expressjs.com/ 中文官网:http://www.ex ...

  4. 【node.js】Express 框架

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

  5. Node.js:Express 框架

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

  6. Node.js、Express框架获取客户端IP地址

    Node.js //传入请求HttpRequest function getClientIp(req) { return req.headers['x-forwarded-for'] || req.c ...

  7. node.js中express框架的基本使用

    express是一个基于node.js平台的,快速,开放,极简的web开发框架. 一.安装 express npm install express --save 二.简单使用 express //引入 ...

  8. node.js安装express框架(1)

    一.全局安装express 使用express首先确保你的node.js已经安装好了环境变量配置成功,安装了npm或者cnpm 你可以在终端上面输入node -v查看你的node版本号 打开cmd终端 ...

  9. 使用Node.js的Express框架进行文件上传

    我们先创建一个Express项目,要使用文件上传的功能还需要下载multer模块. npm install --save multer 下面我们在public文件夹下创建upload.html,内容如 ...

随机推荐

  1. SSH框架用法,及作用(在一位菜鸟使用半年之后归纳的总结)

    SSH框架从接触以来改变了我对代码的编写方式,从最初开始学习到勉强掌握可以说得到不少心得,以下内容出自java初学者对SSH的理解,如有不对的地方还请谅解,希望可以提出来与我交流,谢谢! SSH顾名思 ...

  2. 用python实现一个小游戏——抽牌

    想要实现一个抽牌的功能,有很多种实现方法,这时候我们创造一个对象,通过内置方法来完成这个功能: # Author:Zhang Zhao # -*-coding:utf-8-*- from collec ...

  3. Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探

    由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现. 本文一下未贴出的相关代码示例请关注小编的上篇博文<Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AO ...

  4. 原型模式ProtoType

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/3/4 21:49 # @Author : ChenAdong # @emai ...

  5. ansible部署 lnmp+wordpress

    如上,是项目的目录结构. common: 获取阿里云的yum源 mysql: 二进制安装mysql nginx: 编译安装nginx php-fpm:编译安装php-fpm wordpress: 获取 ...

  6. web前端(10)—— 浮动,清除默认样式

    文档流 web页面和ps等设计软件有本质的区别,web 网页的制作,是个“流”,从上而下 ,像 “织毛衣”,就跟编程语言一样,都是由上而下 而设计软件 ,想往哪里画东西,就去哪里画 文档流带来的最明显 ...

  7. Linux进程核心调度器之主调度器schedule--Linux进程的管理与调度(十九)

    主调度器 在内核中的许多地方, 如果要将CPU分配给与当前活动进程不同的另一个进程, 都会直接调用主调度器函数schedule, 从系统调用返回后, 内核也会检查当前进程是否设置了重调度标志TLF_N ...

  8. c/c++ 二叉排序树

    c/c++ 二叉排序树 概念: 左树的所有节点的值(包括子节点)必须小于中心节点,右树所有节点的值(包括子节点)必须大于中心节点. 不允许有值相同的节点. 二叉排序树的特点: 中序遍历后,就是从小到大 ...

  9. c/c++叉树的创建与遍历(非递归遍历左右中,不破坏树结构)

    二叉树的创建与遍历(非递归遍历左右中,不破坏树结构) 创建 二叉树的递归3种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 二叉树的非递归4种遍历方式: ...

  10. MapFileParser.sh: Permission denied

    Unity项目,需要用Xcode运行,结果报了错误. 解决方案: 1.打开终端, 2.输入以下命令: chmod +x   /Users/......./MapFileParser.sh (MapFi ...