Express系列文章:
(一)Express核心之中间件css
在Express核心之中间件这篇文章中,咱们讲解了Express的核心——中间件,理解了Express的核心功能以后,再去熟悉Express的基础API就变得很容易了。经过进一步掌握Express的基础知识,咱们就可使用Express进行简单的后台开发了。Express的核心API主要包括五类:express.xxx、app.xxx、router.xxx、request.xxx和response.xxx。html
经过掌握这五类核心API,咱们就掌握了Express的基础了。本文的主要内容就是介绍这些基础API。node
express是express模块暴露出来的顶级的函数,用于生成一个应用。所以,咱们先了解一下express的应用。web
建立一个应用:express
const express = require('express');
const app = express(); 复制代码
这里的app就是express生成的一个主应用。一般来讲一个项目只有一个应用,可是express能够生成多个应用,其中一个是主应用,其余的是子应用,子应用经过挂载点挂载到主应用上,子应用具备跟主应用相同的功能,这样方便进行模块化开发。示例:json
const express = require('express');
// 建立两个应用 const app = express(); const admin = express(); // 经过挂载点/admin 将admin做为子应用挂载到app主应用身上。 app.use('/admin',admin); // 子应用具备跟主应用app相同的功能 admin.get('/',(req,res,next) => { res.send('admin子应用'); }) app.listen(5000,() => { console.log('app运行在5000端口') }) 复制代码
在上面的代码片断中,咱们经过express函数生成了两个应用app和admin,而后将admin经过挂载点/admin挂载到app上。这样之后访问/admin都会由admin子应用控制。所以,咱们就能够将admin抽离出来做为一个模块,实现模块化开发。服务器
在Express核心之中间件这篇文章中,咱们提到中间件的分类包括内置的中间件,而内置的中间件主要就是指express自带的中间件express.xxx
。接下来咱们将介绍几种可能用到的中间件。网络
const app = express();
app.post('/user',(req,res,next) => { console.log(req.body); // undefined req.on('data',(chunk) => { console.log(chunk); }) res.send('express.json') }) 复制代码
当咱们使用post进行请求时,若是请求主体中的数据是json格式,那么咱们经过req.body没法获取到请求的数据。由于在node中默认是以流来传输数据的,若是咱们想要获取到body中的数据,须要监听data。示例以下:app
const app = express();
app.post('/user',(req,res,next) => { console.log(req.body); // undefined req.on('data',(chunk) => { console.log(chunk); // {name:'hello'} }) res.send('express.json') }) 复制代码
在上面的代码片断中,咱们经过req.on('data',() => {})获取到了body中的数据。可是这种获取数据太过麻烦了,所以express提供了内置的一些方法用于数据的获取,express.json就是用于获取json格式的数据。咱们只须要在获取数据以前使用这个中间件便可。编辑器
const app = express();
app.use(express.json()); app.post('/user',(req,res,next) => { console.log(req.body); // {name:'hello'} res.send('express.json') }) 复制代码
使用express.json中间件,咱们就能够很方便地在req.body中获取请求的json格式的数据。同理express还提供了几个中间件用于处理其余格式的数据:
经过网络发送静态文件,好比图片,css文件,以及HTML文件等对web应用来讲是一个很是常见的场景。咱们能够经过res.sendFile去发送文件,可是实际上一个简单的发送文件,处理起来很是麻烦,须要很是多的代码量来处理各类状况。好比,咱们发送一个简单的css文件。
app.get("/index.css", (req, res, next) => {
res.setHeader("content-type", "text/css"); res.send("body{background:red}"); }); 复制代码
咱们须要设置发送的文件类型或者还须要对请求头等进行处理,试想一下,整个web网站须要请求多少css文件,多少图片资源,若是每一个静态资源都经过路由去处理,这样项目会变得很是沉重。事实上,这些都是静态资源,不会动态修改,咱们能够将其存储在服务器的一个目录下,而后再从这个目录中进行获取便可。express.static中间件就是用来处理这种静态文件的获取。
const publicPath = path.resolve(__dirname,'public');
app.use(express.static(publicPath)); 复制代码
这样的话,咱们就能够访问public目下下的全部文件了。
http://localhost:5000/index.css
http://localhost:5000/1.jpg 复制代码
注意:express会自动到public目录下查找,所以请求文件的url不要携带public目录名。
express.Router用于建立一个新的router对象,这个a路由对象能够像一个子应用同样设置路由,其目的一样是用于模块化开发。
const router = express.Router();
// rotuer相似于子应用,具备与app一样的功能 router.get('/',(req,res) => { res.send('blog'); }) 复制代码
app应用是express函数执行后获得的对象,他的核心就是app.use()用于执行中间件,这咱们已经在以前的Express核心之中间件这篇文章中讲述过了,并且咱们知道app.xxx等其余方法实际上都是app.use()的语法糖,也就是说 app.xxx全部的功能均可以经过app.use来实现。所以,这里咱们只是列举一下一些经常使用的app方法。
主要包括如下几种路由相关的方法:
app.all()是匹配全部的路由,不区分请求方法。示例:
app.all("/user", (req, res, next) => {
console.log("hello"); next(); }); 复制代码
app.all('/user')既能够匹配app.get('/user'),又能够匹配app.post('/user')的请求,只要是/user的请求,不管是什么方法均可以作出响应。
app.Method()支持全部的方法
这些是常见的路由请求方法
app.get("/user", (req, res, next) => {
console.log('get方法'); next(); }); app.post("/user", (req, res, next) => { console.log('post方法'); res.send("app.get"); }); 复制代码
express默认使用jade模板,可是同时支持其余的模板,所以若是咱们想要使用其余的模板,须要设置模板引擎。 好比咱们想要使用ejs模板,那么应该使用以下设置:
app.set('view engine', 'ejs');
复制代码
app.set()中的'view engine',表示使用的文件模板格式,若是这里设置为ejs,那么它会默认去views下查找ejs文件,也只查找ejs 文件。也就是说这样设置后全部的views下的模板文件后缀都必须是ejs。不能是html这种。然而,有时候咱们更喜欢模板文件是html,可是又 但愿使用ejs,这时候就可使用app.engine()进行设置。
const ejs = require('ejs');
// 设置视图模板格式 app.set('view engine', 'html'); // 设置html引擎 将ejs模板映射到html app.engine("html", ejs.__express); // 使用ejs渲染html模板 复制代码
app.engine()用于将EJS模板映射至".html"文件。
app.set用于设置局部变量,可是最最经常使用的是app.set('view engin')用于设置模板引擎。app.get()用于获取app.set()设置的变量。
// 设置视图引擎
app.set('view engine', 'html'); // 设置html引擎 将ejs模板映射到html app.engine("html", ejs.__express); // 设置局部变量 app.set('name','express'); app.get("/user", (req, res, next) => { // app.get()用于获取 const name = app.get('name'); console.log(name); res.render('index') }); 复制代码
app.locals一样是用于设置局部变量,只不过经过app.locals设置的局部变量在任何地方均可以被访问到。
// 设置
app.locals.title = 'Hello,Express' app.locals.email = 'me@myapp.com' // 获取 cosnole.log(app.locals.title); 复制代码
router能够看作是app的一个子应用,app对象所具备的功能基本上router对象也均可以使用。包括router.all相似于app.all()、router.get/post/put相似于app.get/post/put、rotuer.use()相似于app.use()。router对象只是为了更加方便路由的模块化管理。因此app怎么使用的,router就怎么使用便可。
const express = require('express');
cosnt router = express.Router(); router.get('/', function (req, res) { res.send('hello world') }) 复制代码
request是咱们请求中的request对象上具备的方法,经过这些方法能够获取请求的一些参数。 response是咱们请求的response对象上具备的方法,经过这些方法能够获取响应的一些参数。 resquest和response的参数和方法大都跟http相关,这里只挑选几个容易错误使用的进行介绍, 其余的你们能够查阅相关文档。
req.baseUrl是指路由的挂载点
app.use(express.static(publicPath));
const user = express.Router(); app.use('/user',user); // 路由挂载点是/user user.get('/add',(req,res) => { console.log(req.baseUrl); // req.baseUrl就是 /user res.send('hello'); }) 复制代码
用于获取完整的url路径地址。
user.get('/add',(req,res) => {
console.log(req.baseUrl); // /user console.log(req.originalUrl); // /user/add res.send('hello'); }) 复制代码
用于进行分片下载
var range = req.range(1000)
// the type of the range if (range.type === 'bytes') { // the ranges range.forEach(function (r) { // do something with r.start and r.end }) } 复制代码
上面的req.range(1000),表示1000个字节进行切片,而后一片一片地进行传输。
这篇文章主要介绍Express的一些基础,主要包括:
掌握了这些基础的API,再加上咱们以前学习过的Express的核心——中间件,咱们就可使用Express进行后台开发了,就下来就进入咱们的Express进行实战了。离全栈之路又走进了一步。