Express基础

Express基础

Express系列文章:
(一)Express核心之中间件css

前言

Express核心之中间件这篇文章中,咱们讲解了Express的核心——中间件,理解了Express的核心功能以后,再去熟悉Express的基础API就变得很容易了。经过进一步掌握Express的基础知识,咱们就可使用Express进行简单的后台开发了。Express的核心API主要包括五类:express.xxx、app.xxx、router.xxx、request.xxx和response.xxx。html

  1. express.xxx 是express函数内置的中间件
  2. app.xxx 是express建立的app对象所具备的属性和方法
  3. router.xxx 是跟路由相关的router对象的方法
  4. request.xxx 是请求时的request对象所具备的方法
  5. response.xxx 是响应时的response对象所具备的方法

经过掌握这五类核心API,咱们就掌握了Express的基础了。本文的主要内容就是介绍这些基础API。node

express.xxx

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自带的中间件express.xxx。接下来咱们将介绍几种可能用到的中间件。网络

express.json

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还提供了几个中间件用于处理其余格式的数据:

  1. express.row 用于处理二进制的数据
  2. express.text 用于处理文本数据
  3. express.urlencoded 用于处理&a=123&b=455这种格式的数据

express.static

经过网络发送静态文件,好比图片,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

express.Router用于建立一个新的router对象,这个a路由对象能够像一个子应用同样设置路由,其目的一样是用于模块化开发。

const router = express.Router();
// rotuer相似于子应用,具备与app一样的功能 router.get('/',(req,res) => {  res.send('blog'); }) 复制代码

app.xxx

app应用是express函数执行后获得的对象,他的核心就是app.use()用于执行中间件,这咱们已经在以前的Express核心之中间件这篇文章中讲述过了,并且咱们知道app.xxx等其余方法实际上都是app.use()的语法糖,也就是说 app.xxx全部的功能均可以经过app.use来实现。所以,这里咱们只是列举一下一些经常使用的app方法。

路由相关类方法

主要包括如下几种路由相关的方法:

  1. app.all()
  2. app.METHOD()
  3. app.get()
  4. app.post()
  5. app.put()

app.all

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.Method()支持全部的方法

app.get/post/put/delete

这些是常见的路由请求方法

app.get("/user", (req, res, next) => {
 console.log('get方法');  next(); }); app.post("/user", (req, res, next) => {  console.log('post方法');  res.send("app.get"); }); 复制代码

模板引擎相关的方法

app.engine

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/get

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设置的局部变量在任何地方均可以被访问到。

// 设置
app.locals.title = 'Hello,Express' app.locals.email = 'me@myapp.com' // 获取 cosnole.log(app.locals.title); 复制代码

router.xxx

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.xxx 和respponse.xxx

request是咱们请求中的request对象上具备的方法,经过这些方法能够获取请求的一些参数。 response是咱们请求的response对象上具备的方法,经过这些方法能够获取响应的一些参数。 resquest和response的参数和方法大都跟http相关,这里只挑选几个容易错误使用的进行介绍, 其余的你们能够查阅相关文档。

req.baseUrl

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'); }) 复制代码

req.originalUrl

用于获取完整的url路径地址。

user.get('/add',(req,res) => {
 console.log(req.baseUrl); // /user  console.log(req.originalUrl); // /user/add  res.send('hello'); }) 复制代码

req.range

用于进行分片下载

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的一些基础,主要包括:

  1. express.xxx中间件
  2. app.xxx方法
  3. request.xxx方法
  4. response.xxx
  5. routr.xxx

掌握了这些基础的API,再加上咱们以前学习过的Express的核心——中间件,咱们就可使用Express进行后台开发了,就下来就进入咱们的Express进行实战了。离全栈之路又走进了一步。

相关文章
相关标签/搜索