本文主要介绍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. 使用PIE.htc 进行IE兼容CSS3

    步骤: 1.引入文件.注意PIE.htc文件和css文件要放在同一个目录下: 2.在css元素中加上  behavior:url(pie.htc); 3.可以愉快的写css hack啦 ,这时需要的圆 ...

  2. 02-Docker认识与原理

    目录 02-Docker认识与原理 参考 Docker认识 Docker特性 Docker对比VM Docker社区版本 Docker原理 Docker engine Docker architect ...

  3. python opencv:绘图 基本图形

    参数说明 • img:你想要绘制图形的那幅图像. • color:形状的颜色.以 RGB 为例,需要传入一个元组,例如:( 255,0,0)代表蓝色.对于灰度图只需要传入灰度值. • thicknes ...

  4. Spring Boot 使用 CXF 调用 WebService 服务

    上一张我们讲到 Spring Boot 开发 WebService 服务,本章研究基于 CXF 调用 WebService.另外本来想写一篇 xfire 作为 client 端来调用 webservi ...

  5. 阅读build to win的个人感想

    一个程序员要向各个方面学习,向市场.向用户学习等,不能局限于一方面.除此以外还要有自己的想法,要懂得创新,也需要在各个方面都有所突破,有所超越,实力才是取得胜利的根关键.

  6. 安装插件报错error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++

    起因:学到多线程greenlet模块时,greenlet模块死活装不上,以为pycharm坏掉了,浪费了一下午. #pip3 install greenlet from greenlet import ...

  7. SqlService 并发测试

    使用Sql QueryStress 可输入需要的线程数量,执行次数,对SQL 语句或存储过程进行测试,可查看执行时间及资源耗用.

  8. php 基础知识 post 和get 两种传输方式的区别

    1.post更安全(不会作为url的一部分,不会被缓存.保存在服务器日志.以及浏览器浏览记录中) 2.post发送的数据量更大(get有url长度限制) 3.post能发送更多的数据类型(get只能发 ...

  9. nodejs的POST两种type类型提交(原生)

    POST数据的两种提交格式 application/x-www-form-urlencoded(上传数据中没有文件) multipart/form-data (文件上传) 获取POST数据,post数 ...

  10. PAT A1114 Family Property

    用并查集处理每个家庭的信息,注意标记~ #include<bits/stdc++.h> using namespace std; ; bool visit[maxn]={false}; i ...