Skip to content

Express

脚手架安装:npx express-generator

路由

基本使用

js
// 引入 express框架  
const express= require('express');  
// 创建网站服务器  
const app = express();  

// 对所有请求方法
app.all('/secret', (req, res, next) => {
    console.log('Accessing the secret section ...');
    next(); // 调用下一个匹配的路由或中间件
});

// 根据需求解决跨域问题  
app.use((req, res, next) => {  
    res.header('Access-Control-Allow-Origin', '*');  
    res.header('Access-Control-Allow-Headers', 'Content-Type');  
    res.header('Access-Control-Allow-Methods', '*');  
    next();  
});

// 对应get请求方法
app.get('/', (req, res,next)=> { 
	//结束响应
	res.end()
	
	// 结束响应并设置响应码
	res.status(404).end()
	
	// 结束响应并返回json格式内容
	res.json({a:1})
	
    // 结束响应并返回内容 
    res.send('hello world');  
    
    // 继续将请求传给下一个中间件
    next()
    
    // 重定向
    res.redirect('http://baidu.com')

	// 文件下载,第一个参数为下载文件路径,第二个参数为下载后文件名,第三个参数为出错回调
	// 下载文件路径可以使用绝对路径,也可使用相对路径(启动 Node.js 进程的目录)
	res.download(filePath, (err) => {  
	    if (err) {  
	        // 如果出现错误,发送响应表示失败  
	        res.status(500).send('error');  
	    }  
	});
})  
  
// 监听端口  
app.listen(3000);  
console.log('网站服务器启动成功');

模块化

js
// 创建client.js,存放/client路径下的路由
const express = require('express');  
// 创建路由对象  
const client = express.Router();
// 挂载路由  
client.get('/index', (req, res) => {  
    res.send('客户端首页')  
});
module.exports = client;



// 创建admin.js,存放/admin路径下的路由
const express = require('express');  
// 创建路由对象  
const admin = express.Router();  
// 挂载路由  
admin.get('/index', (req, res) => {  
    res.send('管理端首页!')  
});  
module.exports = admin;



// app.js绑定两个模块,路径将会拼接为/client/index,和/admin/index

const express = require('express');  
// 创建网站服务器  
const app = express();  
  
// 导入路由模块  
const client = require('./route/client');  
const admin = require('./route/admin');  
  
// 路径匹配  
app.use('/client', client);  
app.use('/admin', admin);  
  
app.listen(3000);  
console.log('网站服务器启动成功');

参数获取

query参数

js
// 通过req.query获取,
// URL:http://localhost:3000/?user=1&add=2,获取为对象:{"user":"1","add":"2"}
app.get('/', (req, res)=> {  
    res.send(req.query);  
})

path 参数

js
// 获取params需要事先使用占位`/:xxx`进行占位,然后才能够使用`req.params`获取到对应的值
app.get('/index/:id/:name/:age', (req, res)=> {  
    // 路径参数
    res.send(req.params); //{"id": "10", "name": "zhangshan", "age": "18"  }  
})

body 参数

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

// 引入  body-parser 模块  
const  bodyParser = require('body-parser');  

// 解析表单结构数据
app.use( bodyParser.urlencoded({extended: false}));  

// 解析json、text、raw等类型数据
// app.use( bodyParser.json() );  
// app.use( bodyParser.text());  
// app.use( bodyParser.raw());


app.post('/add', (req, res) =>{  
    // 接收 post 请求参数 req.body    
    res.send(req.body);  
})

app.listen(3000);  
console.log('服务器启动成功');

中间件

中间件方法由 Express 提供,负责拦截请求,对同一个请求可以设置多个中间件

  • 默认情况下,请求从上到下依次匹配中间件,一旦匹配成功,终止匹配。
  • 可以调用 next 方法,将请求的控制权交给下一个中间件,直到遇到结束请求的中间件

基本使用

js
// 引入 express框架  
const express= require('express');  
// 创建网站服务器  
const app = express();  
  
// 放在实际请求前面,对拦截到的请求做一些操作(app.use默认是对所有请求)
// app.use也可以传递第一个路径参数,表示对该路径下请求才添加该中间件
app.use((req, res, next) => {  
    res.send('一系列操作')
    if(condition){
	    // 放行
	    next()
    } else {
	    res.send("结束请求")
    }  
})  


// 实际请求方法
app.get('/admin', (req, res)=> {  
    res.send('您已经登录,可以访问当前页面')  
})  
  
// 放在实际请求后面,如果前面所有请求都没返回响应,可以在此处作某些操作
app.use((req, res, next) => {  
    // 为客户端 响应状态码和提示信息  
    res.status(404).send('当前访问的页面是不存在的.')  
})  
  
// 监听端口  
app.listen(3000);  
console.log('网站服务器启动成功');

错误中间件

js
const express = require('express');  
const app = express();  
  
// 同步操作中的错误信,通过抛出错误对象,中间件就可以接收到错误  
app.get('/index', (req, res) =>{  
    // 抛出错误对象  
    throw new Error('程序发生了未知错误')  
    res.send('程序正常执行')  
})  


// 异步API操作中的错误不能捕获到,需要使用next方法,并把错误信息传入才可以触发错误中间件  
app.get('/index', (req, res, next) =>{  
    fs.readFile('./demo.txt','utf-8', (err, data) => {  
        // 文件读取失败  
        if(err != null) {  
            next(err); // 触发 错误处理中间件  
        } else {  
            res.send(data)  
        }  
    })  
})


// 错误处理中间件,当触发错误时会调用该中间件
app.use((err, req, res, next) => {  
    // res.status(500).send('服务器端错误');  
    res.status(500).send(err.message);  
})  
  
app.listen(3000);  
console.log('网站服务器启动成功');