本文主要介绍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. 201771010135 杨蓉庆《面对对象程序设计(java)》第十七周学习总结

    1.实验目的与要求 (1) 掌握线程同步的概念及实现技术: (2) 线程综合编程练习 一.理论知识 ⚫ 线程同步 (1)多线程并发运行不确定性问题解决方案:引入线 程同步机制,使得另一线程要使用该方法 ...

  2. FULL OUTER JOIN

    FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行. SELECT Web.name, access.count, access.dat ...

  3. 吴裕雄 python 神经网络——TensorFlow图片预处理

    import numpy as np import tensorflow as tf import matplotlib.pyplot as plt # 使用'r'会出错,无法解码,只能以2进制形式读 ...

  4. 基于SILVACO ATLAS的a-IGZO薄膜晶体管二维器件仿真(08)

    进展比较慢啊... 根据江南大学硕士论文IGZO/IZO双有源层薄膜晶体管特性的模拟研究: 其中, gCBa:类受主导带尾态 gVBd:类施主价带尾态 gGd:类施主氧空位态 NDeep:价带尾深施主 ...

  5. 【笔记5-购物车及地址模块】从0开始 独立完成企业级Java电商网站开发(服务端)

    购物车模块 数据库表设计 购物车表 CREATE TABLE mmall_ cart ( 'id' int(11) NOT NULL AUTO_ INCREMENT, 'user_ id' int(1 ...

  6. laravel 报错The Mix manifest does not exist.

    这是因为我们在 resources/views/layouts/app.blade.php 中使用 mix() 方法,而我们还未运行 Laravel Mix 进行编译,找不到 mix-manifest ...

  7. python opencv:代码执行时间计算

    t1 = cv2.getTickCount() # ...... t2 = cv2.getTickCount() # 计算花费的时间:毫秒 time = (t2-t1) / cv2.getTickFr ...

  8. C#开发点滴记录

    1.开发windows服务程序,不应该在程序中调用windform相关的方法与类库,会产生未知的异常,windows服务中是可以产生日志文件的,会生成在安装服务的当前路径下面,比如服务为D:/MySe ...

  9. POJ3268 Silver Cow Party (建反图跑两遍Dij)

    One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big co ...

  10. spring boot 配置时区差别

    前提 数据库时区:GMT+8 show variables like '%time_zone%'; 本机电脑时区: 情景一.不指定时区 传递的参数映射到Data不指定时区,连接数据库不指定时区,保存时 ...