本文主要介绍express中间件的原理,来应对面试。

1、安装express及初始化:

  npm install express-generator -g   =>   express express-test   =>  npm install & npm start   => 在bin文件夹中的www.js文件中可以看到访问的端口是3000,通过浏览器访问localhost:3000。

  为了方便开发及调试,我们还需要npm i nodemon cross-env --save-dev,其中cross-env用来设置环境变量的参数,nodemon用来监听文件的变化,这样我们修改代码的时候就不需要每次手动重启服务,可以避免产生一些非预期的错误。安装好这两个插件之后,打开package.json文件,在scripts中添加以下代码:

"dev": "cross-env NODE_ENV=dev nodemon ./bin/www.js"
{
"name": "blog-express",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www",
"dev": "cross-env NODE_ENV=dev nodemon ./bin/www.js"
},
"dependencies": {
"cookie-parser": "~1.4.4",
"debug": "~2.6.9",
"express": "~4.16.1",
"http-errors": "~1.6.3",
"jade": "~1.11.0",
"morgan": "~1.9.1"
},
"devDependencies": {
"cross-env": "^6.0.3",
"nodemon": "^2.0.2"
}
}

保存好之后,命令行运行npm run dev

2、目录介绍:

  bin/www.js:  创建http服务

  public: 静态文件目录,单纯开发接口的话,此目录可以忽略。

  routes: 存放路由文件。

  views: 存放html模板,忽略。

3、app.js(重要):

  下面是代码,我做了一些注释:

var createError = require('http-errors');    //处理报错信息模块
var express = require('express'); //引用express框架
var path = require('path'); //提供了一些用于处理文件路径的小工具
var cookieParser = require('cookie-parser'); //解析cookie
var logger = require('morgan'); //记录access log生成日志 var indexRouter = require('./routes/index'); //引用路由
var usersRouter = require('./routes/users'); var app = express(); //初始化app // view engine setup
app.set('views', path.join(__dirname, 'views')); //前端模板处理,不用管可以注释
app.set('view engine', 'jade'); //注册各种功能
app.use(logger('dev'));
app.use(express.json()); //处理post过来的data 路由中直接用req.body来获取 用来获取content-type = application/json格式的数据
app.use(express.urlencoded({ extended: false })); //处理表单提交过来的数据 content-type = x-www-form-urlencoded格式
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public'))); //不用管可以注释 app.use('/', indexRouter); //注册路由 '/' 目的是与路由文件中的path进行拼接,如:路由文件中的path是/user
app.use('/users', usersRouter); // 这里的path '/users' 目的是与路由文件中的path进行拼接,如:路由文件中的path是/list 最后访问的地址就为/user/list // catch 404 and forward to error handler
app.use(function(req, res, next) { //检测404
next(createError(404));
}); // error handler
app.use(function(err, req, res, next) { //抛出服务端报错
// set locals, only providing error in development
res.locals.message = err.message;
//res.locals.error = req.app.get('env') === 'development' ? err : {};
res.locals.error = req.app.get('env') === 'dev' ? err : {}; //因为在package.json中设置的环境变量是dev,所以这里做了修改 // render the error page
res.status(err.status || 500);
res.render('error');
}); module.exports = app;

4、处理路由(重要):

  路由是什么?请自己百度!

  1)get请求:

在routes文件夹中新建blog.js文件,编写代码

var express = require('express');
var router = express.Router(); router.get('/list', function(req, res, next) {
res.json({
errno: 0,
data: [1, 2, 3]
})
}); module.exports = router;

写好之后,编写app.js:

const blogRouter = require('./routes/blog')    //定义路由
app.use('/api/blog', blogRouter)   //注册路由
访问localhost:3000/api/blog/list,可以看到我们定义的返回值正确的打印在浏览器中。
其中,res.json({})  可以解析并返回json字符串,原生实现大致原理是:res.end(JSON.stringify(userData))。另外它还可以自动设置返回的头信息为json格式,原生实现大致原理:res.setHeader('Content-type', 'application/json')
  2)post请求
在blog.js文件中,编写代码:
router.post('/login', function(req, res, next) {
const { username, password } = req.body //因为应用了express.json(),所以可以直接从req.body中获取postdata
res.json({
errno: 0,
data: {
username,
password
}
})
});

打开postman,访问http://localhost:3000/api/blog/login,设置方法如下:

可以看到这里返回了我们设置的数据。

5、关于中间件的理解(重中之重):

  以下文字是转载某大佬的博客(博客地址:https://blog.csdn.net/huang100qi/article/details/80220012):

我们先来分析一下从浏览器地址栏输入url到客户端显示数据之间这个过程到底发生了什么?

浏览器向服务器发送一个请求后,服务器直接通过request.定位属性的方式得到通过request携带过去的数据(有用户输入的数据和浏览器本身的数据信息)。这中间就一定有一个函数将这些数据分类做了处理,已经处理好了,最后让request对象调用使用,对的,这个处理数据处理函数就是我们要说的 中间件 。由此可见,中间件可以总结以下几点:

1、封装了一些处理一个完整事件的功能函数。

2、非内置的中间件需要通过安装后,require到文件就可以运行。

3、封装了一些或许复杂但肯定是通用的功能。

光说可能不太懂,看代码你就知道了!

这是一个验证登录的函数:

module.exports = (req, res, next) => {
if (req.session.username) {
next()
return
}
res.json({
data: '未登录'
})
}

然后在路由函数中作为参数传入:

router.post('/new', loginCheck, (req, res, next) => {
req.body.author = req.session.username
const result = newBlog(req.body)
return result.then(data => {
res.json({
data: '登陆成功'
})
})
})

这个loginCheck就是中间件。如果验证成功,就执行next(),返回“登陆成功”。这只是些简单的理解,详情请看大佬博客https://www.cnblogs.com/houfee/p/10366082.html

express框架安装及中间件原理的更多相关文章

  1. Koa框架实践与中间件原理剖析

     最近尝试用了一下Koa,并在此记录一下使用心得. 注意:本文是以读者已经了解Generator和Promise为前提在写的,因为单单Generator和Promise都能够写一篇博文来讲解介绍了,所 ...

  2. Node的express框架安装

    第一步:在cmd命令行下执行npm install -g express,安装全局的express. 第二步:在命令行中输入express,如果出现express不是内部命令时, 输入npm inst ...

  3. Node.js Express 框架

    Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP ...

  4. express框架以及配置项

    以上命令会将 Express 框架安装在当前目录的 node_modules 目录中, node_modules 目录下会自动创建 express 目录.以下几个重要的模块是需要与 express 框 ...

  5. nodejs基础 -- express框架

    Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP ...

  6. Node.js:Express 框架

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

  7. Node.js Express 框架 Express

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

  8. 44.Node.js Express 框架--web框架

    转自:http://www.runoob.com/nodejs/nodejs-express-framework.html Express 简介 Express 是一个简洁而灵活的 node.js W ...

  9. Win8.1 安装Express 框架

    1.安装Windows Node.js客户端 2.安装Express框架 我本机是Win8.1的,使用命令npm install -g express安装Express,安装完成后显示一些安装明细,刚 ...

随机推荐

  1. 在visual studio 2015 中调试caffe

    看到这里,默认已经安装并编译过caffe了. 要学习caffe源码就要调试,在windows下调试.使用visual studio 2015调试caffe源码. 第一步:将生成caffe.lib的ca ...

  2. 从0到1了解 CI/CD

    现代软件开发的需求加上部署到不同基础设施的复杂性使得创建应用程序成为一个繁琐的过程.当应用程序出现规模性增长,开发团队人员变得更分散时,快速且不断地生产和发布软件的流程将会变得更加困难.为了解决这些问 ...

  3. sqlite3 install 和使用

    windows: 在 Windows 上安装 SQLite 请访问 http://www.sqlite.org/download.html,从 Windows 区下载预编译的二进制文件. 您需要下载  ...

  4. Java入门笔记 06-常用类

    介绍:本章将介绍Java的一些常用类,内容不完整,会在后续使用过程中逐步完善. 一. 字符串相关类: 1. String类介绍: |--- String类声明为final的,不能被继承: |--- 实 ...

  5. php中截取中文不乱吗

    php截取中文的使用是随处可见的,譬如,博客首页显示简介,可能会用到,或一些相册简介会用到,以前不知道,还傻傻的自己去写函数用来做“智能截取”,效果还不十分好,幸运的是,今天因为一位同学做项目,让我一 ...

  6. 【代码学习】PYTHON 函数

    一.定义函数 def 函数名(): 代码 二.函数调用 #定义函数 def printme(str): print str return #调用函数 printme("SQYY1" ...

  7. 洛谷P1140 相似基因(线性DP)

    题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...

  8. 5G新时代开启,你会选择哪家运营商?

    牌照正式发放后,5G新时代正式来临.而5G时代显然开了个好头,B站UP主"老师好我叫何同学"发布的<有多快?5G在日常使用中的真实体验>视频,引爆全网.除了仅在B站就获 ...

  9. Maven的安装与配置(eclipse,idea)

    Maven的安装与配置   一.需要准备的东西 1. JDK 2. Maven程序包 3. Eclipse 4. Idea 二.下载与安装 1. 前往https://maven.apache.org/ ...

  10. python学习 —— 获取系统运行情况信息并在Linux下设置定时运行python脚本

    代码: # -*- coding:utf-8 -*- from psutil import * def cpu_usage_rate(): for i, j in zip(range(1, cpu_c ...