node.js之express框架

498 阅读3分钟

前言

express框架其实在node中是一个很重要的框架,它里面有很多功能在我们开发项目中都是经常会用到的,比如搭配http使用,路由,服务端渲染等,今天我们这篇文章主要介绍express的基本用法。

Express

Express是基于 Node.js 平台,快速、开放、极简的 web 开发框架。是建立在http模块上,核心是对http模块的再包装,相当于是再http模块上加了一个中间层。

Express的安装

express实际上实际上就是一个包,直接使用包管理工具的安装方式即可,这里我们就以npm为例,安装命令如下:

npm init
npm i express

这时我们可以发现有了一个node_modules文件夹,并且这个文件夹多了很多文件。

要查看express是否安装成功,可以使用下面的命令查看。 需要注意的是从express4.0版本之后,express便将命令工具分出来了,需要首先安装一个命令工具,命令如下:

npm install -g express-generator

然后再输入查看版本信息的命令:

express --version

效果如下:

image.png

express运行原理

Express框架相当于是在http模块上加了一个中间层(中间件)。

我们在之前的http模块中创建一个服务的时候,代码是这样的。

const http = require('http');
const server = http.createServer((req, res) => {
  res.write('ok');
  res.end('ok');
});
server.listen(3000);

现在有了express之后,我们可以将上述代码改成这样:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('hello express');
});

app.listen(3000);

效果如下:

1681652229112.png

中间件就是处理http请求的函数。一个中间件处理完,再传递给下一个中间件。App实例在运行过程中,会调用一系列的中间件。

每个中间件可以从App实例,接收三个参数,依次为request对象(代表Http请求),response对象(代表HTTP回应),next回调函数(代表下一个中间件)。每个中间件都可以对HTTP请求(request对象)进行加工,并且决定是否调用next方法,将request对象再传给下一个中间件。

Express路由用法

1. 路由

路由表示应用程序端点 (URI) 的定义以及响应客户端请求的方式。是由一个URI、HTTP请求(GET、POST等)和若干个句柄组成。它的结构如下:

app.methods(path, callback);
  • app是express对象的一个实例。
  • method是一个HTTP请求方法。
  • path是服务器上的路径。
  • callback是当路由匹配时要执行的函数。
app.get('/', (req, res) => {
  res.send('hello express');
});

2. all方法

app.all('*', (req, res, next) => {
  res.send('hello express');
  next();
});

all方法表示,所有请求都必须通过该中间件。

3. 获取请求参数

express中提供了很多方法可以直接获取请求参数。

req.query

req.query用来获取接口请求中拼接在路径'?'后边的参数。并且会自动将参数转换为对象形式返回。

const express = require('express');
const app = express();

app.get('/test?name=Tom&age=18', (req, res) => {
  console.log('参数', req.query);
  res.send('hello express');
});

app.listen(3000);

req.body

req.body获取post请求的表单数据。

app.post('/test', (req, res) => {
  console.log('body', req.body);
  res.send('hello express');
});

除此之外还有其他的用法

app.post('/test', (req, res) => {
  console.log(req.method);
  console.log(req.url);
  console.log(req.httpVersion);
  console.log(req.headers);
  console.log(req.path);
  console.log('body', req.body);
  res.send('hello express');
});

4. 获取路由参数

req.params用于在url链接上传递数据参数,需要后台接口用==:变量名==的写法发起请求。

app.get('/test/num:num', (req, res) => {
  console.log('参数', req.params);
  res.send('hello express');
});

express响应设置

express上提供了很多关于响应设置的方法。

  • res.download(): 提示要下载的文件
  • res.end(): 结束响应进程
  • res.json(): 发送JSON响应
  • res.jsonp(): 发送带有JSONP支持的JSON响应
  • res.direct(): 重定向请求
  • res.render(): 渲染视图模板
  • res.send(): 发送各种类型的响应
  • res.sendFile(): 将文件作为八位字节流发送
  • res.sendStatus(): 设置响应状态代码,并将其字符串表示形式发送为响应正文
app.post('/test', (req, res) => {
  res.statusCode = 404;
  res.statusMessage = 'xxx';
  res.setHeader('abc','xyz');
  res.write('响应体');
  res.end('xxx');

  res.status(500); //设置响应状态码
  res.set('xxx','yyy');//设置响应头
  res.send('中文响应不乱码');//设置响应体
  //连贯操作
  res.status(404).set('xxx','yyy').send('你好朋友')
  
  res.redirect('http://atguigu.com')//重定向
  res.download('./package.json');//下载响应
  res.json();//响应 JSON
  res.sendFile(__dirname + '/home.html') //响应文件内容
});