express框架安装及中间件原理
本文主要介绍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:
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框架安装及中间件原理的更多相关文章
- Koa框架实践与中间件原理剖析
最近尝试用了一下Koa,并在此记录一下使用心得. 注意:本文是以读者已经了解Generator和Promise为前提在写的,因为单单Generator和Promise都能够写一篇博文来讲解介绍了,所 ...
- Node的express框架安装
第一步:在cmd命令行下执行npm install -g express,安装全局的express. 第二步:在命令行中输入express,如果出现express不是内部命令时, 输入npm inst ...
- Node.js Express 框架
Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP ...
- express框架以及配置项
以上命令会将 Express 框架安装在当前目录的 node_modules 目录中, node_modules 目录下会自动创建 express 目录.以下几个重要的模块是需要与 express 框 ...
- nodejs基础 -- express框架
Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP ...
- Node.js:Express 框架
Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具.使用 Express 可以快速地搭建一个完整功能的网站 ...
- Node.js Express 框架 Express
Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具. 使用 Express 可以快速 ...
- 44.Node.js Express 框架--web框架
转自:http://www.runoob.com/nodejs/nodejs-express-framework.html Express 简介 Express 是一个简洁而灵活的 node.js W ...
- Win8.1 安装Express 框架
1.安装Windows Node.js客户端 2.安装Express框架 我本机是Win8.1的,使用命令npm install -g express安装Express,安装完成后显示一些安装明细,刚 ...
随机推荐
- 使用PIE.htc 进行IE兼容CSS3
步骤: 1.引入文件.注意PIE.htc文件和css文件要放在同一个目录下: 2.在css元素中加上 behavior:url(pie.htc); 3.可以愉快的写css hack啦 ,这时需要的圆 ...
- 02-Docker认识与原理
目录 02-Docker认识与原理 参考 Docker认识 Docker特性 Docker对比VM Docker社区版本 Docker原理 Docker engine Docker architect ...
- python opencv:绘图 基本图形
参数说明 • img:你想要绘制图形的那幅图像. • color:形状的颜色.以 RGB 为例,需要传入一个元组,例如:( 255,0,0)代表蓝色.对于灰度图只需要传入灰度值. • thicknes ...
- Spring Boot 使用 CXF 调用 WebService 服务
上一张我们讲到 Spring Boot 开发 WebService 服务,本章研究基于 CXF 调用 WebService.另外本来想写一篇 xfire 作为 client 端来调用 webservi ...
- 阅读build to win的个人感想
一个程序员要向各个方面学习,向市场.向用户学习等,不能局限于一方面.除此以外还要有自己的想法,要懂得创新,也需要在各个方面都有所突破,有所超越,实力才是取得胜利的根关键.
- 安装插件报错error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++
起因:学到多线程greenlet模块时,greenlet模块死活装不上,以为pycharm坏掉了,浪费了一下午. #pip3 install greenlet from greenlet import ...
- SqlService 并发测试
使用Sql QueryStress 可输入需要的线程数量,执行次数,对SQL 语句或存储过程进行测试,可查看执行时间及资源耗用.
- php 基础知识 post 和get 两种传输方式的区别
1.post更安全(不会作为url的一部分,不会被缓存.保存在服务器日志.以及浏览器浏览记录中) 2.post发送的数据量更大(get有url长度限制) 3.post能发送更多的数据类型(get只能发 ...
- nodejs的POST两种type类型提交(原生)
POST数据的两种提交格式 application/x-www-form-urlencoded(上传数据中没有文件) multipart/form-data (文件上传) 获取POST数据,post数 ...
- PAT A1114 Family Property
用并查集处理每个家庭的信息,注意标记~ #include<bits/stdc++.h> using namespace std; ; bool visit[maxn]={false}; i ...