Directorio de artículos
Instalación exprés frontal
- Método 1: utilice el andamio proporcionado por express para crear directamente el esqueleto de una aplicación
- Instalar andamios npm install -g express-generator
- Crear proyecto express express-demo
- Instalar dependencias npm install
- Inicie el nodo del proyecto bin/www
- Método 2: cree su propia estructura de aplicación exprés desde cero;
- Inicializa el proyecto npm init
- Instalar express npm i express
1. Uso básico
- Importar–>Crear–>Escuchar
- Utilice documentación de referencia
const express = require('express');
// * 创建express服务器
const app=express()
// * 启动服务器 ,监听端口
app.listen(8000,()=>{
console.log('启动express 服务器')
})
// 请求
app.post('/login',(req,res)=>{
res.end('登录成功')
})
app.get('/home',(req,res)=>{
res.end('home 列表模块')
})
2. software intermedio
- La esencia del middleware es una función de devolución de llamada que se pasa para expresar;
- Esta función de devolución de llamada acepta tres parámetros:
- objeto de solicitud (objeto de solicitud);
- Objeto de respuesta (objeto de respuesta);
- siguiente función (una función definida en express para ejecutar el siguiente middleware);:
重要
El proceso de ejecución del middleware solo ejecutará el primer middleware coincidente. Verifique si se ejecutará más tarde.next
app.post('/login', (req, res, next) => {
// 中间件中的req与res可以进行修改
res.aaa = '添加aaa并修改res'
// 2. JSON结束
// res.json({message:'登录成功',code:200})
// res.end('登录成功')
// 3. next 匹配执行下一个中间件
next()
})
注意点
: Si la función de middleware actual no finaliza el ciclo de solicitud-respuesta, se debe llamar a next(). Esto pasa el control a la siguiente función de middleware; de lo contrario, la solicitud se suspenderá.
const express = require('express');
// * 创建express服务器
const app = express()
// * 启动服务器 ,监听端口
app.listen(8000, () => {
console.log('启动express 服务器')
})
// 请求
app.post('/login', (req, res, next) => {
// 中间件中的req与res可以进行修改
res.aaa = '添加aaa并修改res'
// 2. JSON结束
// res.json({message:'登录成功',code:200})
// res.end('登录成功')
// 3. next 匹配执行下一个中间件
next()
})
app.use((req,res,next)=>{
console.log('执行下一个中间件next');
})
app.get('/home', (req, res) => {
res.end('home 列表模块')
})
2.1 Aplicación de software intermedio
- Express proporciona principalmente dos métodos:
- aplicación/router.use;
- app/router.methods;
uso de la aplicación
app.use((req,res,next)=>{
console.log('执行下一个中间件next');
})
métodos de aplicación
app.get('/home', (req, res) => {
res.end('home 列表模块')
})
3. Cómo registrar middleware
3.1 Registro de middleware común
use注册
El middleware se puede combinar independientemente de la ruta o solicitud.- Al mismo tiempo, durante el proceso de coincidencia
next()
, solo se ejecutará el primer middleware.
// 1. use注册的中间件不管什么路径或者请求都可以匹配的上
// 2. 同时在匹配的过程中如何不 next(), 只会执行第一个中间件
app.use((req,res,next)=>{
console.log('执行下一个中间件next');
next()
})
app.use(()=>{
console.log('执行第二个中间件')
})
3.2 middleware de coincidencia de rutas
-El middleware de coincidencia de ruta solo limita la ruta y no muestra el método de solicitud.
// 这里的路径匹配中间件只是对路径做限制并没有请求方式做显示
// 不管method如何都可以匹配
app.use('/home',(req,res,next)=>{
console.log('路径匹配中间件')
})
3.3 coincidencia de métodos y rutas
- gramática:
app.method(path,middleware)
- El middleware coincidente solo coincidirá con el primer middleware que cumpla con los requisitos. La ejecución del siguiente middleware depende de si se llama al siguiente .
// app.method(path,middleware)
app.get('/home',(req,res,next)=>{
console.log('路径以及方法匹配');
res.end('匹配成功')
})
// 注册多个中间件
app.get('/home', (req, res, next) => {
console.log('路径以及方法匹配');
res.end('匹配成功')
// 中间的匹配只会匹配第一个符合要求的中间件 , 关于下一个中间件是否执行看有没有调用next
}, (req, res, next)=>{
console.log('关于这个中间件的执行需要看上一个中间件是否有next');
})
3.4 Método de ejecución y coincidencia de middleware de casos
- Escritura directa ordinaria
app.post('/login', (req, res, next) => {
req.on('data', data => {
let userInfo = data.toString()
const user = JSON.parse(userInfo)
if (user.username === 'admin' && user.password===123456) {
res.end('登录成功')
}else{
res.end('账号或者密码错误')
}
})
})
// 注册信息
app.post('/register', (req, res, next) => {
// res.end('注册成功')
// 注册要查询数据库,看是否存在用户名
if (true) {
req.on('data', data => {
let userInfo = data.toString()
const user = JSON.parse(userInfo)
if (user.username === 'admin' && user.password === 123456) {
res.end('注册成功')
} else {
res.end('账号或者密码错误')
}
})
}
})
- **Optimización
JSON解析,放到body后next()
**
// 1. JSON解析,放到body
app.use((req, res, next) => {
if (req.headers['content-type'] === 'application/json') {
req.on('data', data => {
const jsonInfo = JSON.parse(data.toString())
req.body = jsonInfo
})
req.on('end', () => {
next()
})
}
})
// 账号密码
app.post('/login', (req, res, next) => {
console.log(req.body);
res.end('登录成功')
})
// 注册信息
app.post('/register', (req, res, next) => {
console.log(req.body);
})
4. Análisis de datos de solicitud de middleware
express
Hay algún middleware integrado que nos ayuda a completar el análisis de solicitudes;
4.1 Middleware del cuerpo de solicitud de análisis
app.use((req, res, next) => {
if (req.headers['content-type'] === 'application/json') {
req.on('data', data => {
const jsonInfo = JSON.parse(data.toString())
req.body = jsonInfo
})
req.on('end', () => {
next()
})
}
next()
})
// 账号密码
app.post('/login', (req, res, next) => {
console.log(req.body);
res.end('登录成功')
})
- utilizado en el código anterior
JSON.parse对data数据进行解析
, peroexpress中提供了 json可以直接进行解析
app.use(express.json())
// 账号密码
app.post('/login', (req, res, next) => {
console.log(req.body);
res.end('登录成功')
})
4.2 análisis codificado en URL
- Al analizar el cliente se utilizan
urlencoded
parámetros pasados, entonces es necesario utilizarexpress.urlencoded()
app.use(express.urlencoded()) // 解析客户端利用urlencoded传参
// 解决 body - parser deprecated undefined extended: provide extended option 05urlencoded警告
app.use(express.urlencoded({
extended: true }))
app.post('/login', (req, res, next) => {
console.log(req.body);
res.end('登录成功')
})
5. Middleware de terceros
5.1 registro de Morgan
const express = require('express');
const morgan = require('morgan');
const fs = require('fs');
const app = express()
// cnpm i morgan 安装
// 第三方中间件 合并日志
const writerLog=fs.createWriteStream('./log.txt')
// 日志写入
app.use(morgan('combined', {
stream: writerLog }))
app.post('/login', (req, res, next) => {
console.log(req.body);
res.end('登录成功')
})
5.2 carga de archivos múltiples
- Instalar
npm i multer --save
Multer
Maneje únicamentemultipart/form-data
datos de formulario de cualquier tipo.Multer
Estará enexpress 的 request 对象里添加一个 body 对象
(que contiene la información del campo de texto del formulario) y el objetofile
ufiles
(se obtiene un solo archivo mediantereq.file
la obtención, se obtienen varios archivos mediantereq.files
la obtención, el archivo o los archivos objeto contienen la información del archivo cargada por el formulario del objeto).注意点
El valor de upload.single corresponde al valor del nombre del front-end y, al mismo tiempo,form-data
el valor de la clave debe mantenerse igual.
const multer = require('multer');
// 对上传的文件名字重起
const upload = multer({
storage: multer.diskStorage({
// 文件名称,
// destination 是用来确定上传的文件应该存储在哪个文件夹中
// destination 是一个函数,必须创建这个文件夹
destination(require, file, callback) {
callback(null, 'uploads/')
},
filename(require, file, callback) {
// originalname是文件上传时的名字,可以根据它获取后缀
callback(null, Date.now() + '_' + file.originalname)
}
})
})
app.post('/upload', upload.single("file"), (req, res, next) => {
console.log(req.file); // 文件信息
res.end('文件上传成功')
})
- Carga de múltiples archivos, acepta una matriz
- mientras que en
multer实例.array(fielname[,maxCount])
- recibir un afielname命名的文件数组
;maxCount——限制上传的最大数量,这些文件的信息保存在req.files里面
app.post('/upload', upload.array("file"), (req, res, next) => {
console.log(req.files); // 文件信息
res.end('文件上传成功')
})
Análisis de referencia
Analizar datos ordinarios en form-data
const formData= multer()
app.post('/login',formData.any(), (req, res, next) => {
console.log(req.body);
res.end('登录成功')
})
6. Consulta y análisis de parámetros.
- La consulta se utiliza principalmente para paginación.
app.post('/list', (req, res, next) => {
// http://localhost:8000/list?offset=10&page=20解析
console.log(req.query); // { offset: '10', page: '20' }
res.end('登录成功')
})
- params se utiliza principalmente para pasar id
app.post('/user/:id', (req, res, next) => {
// http://localhost:8000/user/1100
const id = req.params.id
res.end(`获取用户${
id}`)
})
7. Datos de respuesta
end方式
: Similar al método Response.end en http, el uso es consistentejson方法
: Se pueden pasar muchos tipos al método json: objeto, matriz, cadena, booleano, número, nulo, etc., y se convertirán al formato json y se devolverán.status方法
: Se utiliza para configurar el código de estado;注意
es una función- Otras referencias al contenido de la respuesta
app.get('/login', (req, res, next) => {
// 1. 方法一 end
// res.end(`响应数据---登录成功`)
// 2. JSON数据响应
// res.json({
// code: 0, message: '欢迎回来', data: [{
// name: "admin",
// avator:'www.http.ccc.jpg'
// }]
// })
// 3. status 方法,设置http状态码
res.status(201)
res.json(
{
code: 0, message: '欢迎回来', data: [{
name: "admin",
avator: 'www.http.ccc.jpg'
}]
}
)
})
8. Enrutamiento
express.Router
para crear un controlador de ruta
utilizarRouter.js
const express = require('express');
const userRouter = express.Router()
userRouter.get('/', (req, res, next) => {
res.json(
{
code: 0, message: 'success', data: [{
name: "admin",
password:'123456'
}, {
name: "admin",
password: '123456'
}]
}
)
})
userRouter.get('/:id',(req, res, next) => {
const id=req.params.id
res.end(id)
})
userRouter.post('/', (req, res, next) => {
})
userRouter.delete('/:id', (req, res, next) => {
})
userRouter.patch('/:id', (req, res, next) => {
})
module.exports=userRouter
index.js
const userRouter = require('./router/userRouters.js');
app.use('/users', userRouter)
Artículo de referencia : Uso específico del enrutamiento en proyectos.
9. Recursos estáticos
express 内置static() 静态资源
, convierte directamente la carpeta en un recurso estático
app.use(express.static('./uploads'))
10 Manejo de errores
- El manejo de errores ordinario requiere el uso de datos iniciales para el procesamiento de juicios.
- Sin embargo, cada interfaz escribe un juicio o devuelve el mismo mensaje de error y código de estado, lo que provocará redundancia en el código.
app.post('/login', (req, res, next) => {
const {
username, password } = req.body
if (username !== 'admin' || password !== 123456) {
res.json({
code: 1002,
message: '账号密码错误'
})
} else {
console.log('xx')
res.json({
code: 200,
message: '登录成功'
})
}
})
- Encapsulación simple y procesamiento unificado
// 中间件处理错误信息
app.post('/login', (req, res, next) => {
if (username !== 'admin' || password !== 123456) {
next(1002)
}
else {
next()
}
})
app.use((errCode, req, res, next) => {
const code = errCode
let message = ''
switch (code) {
case 1001:
message = '未知的错误'
break
case 1002:
message = '账号或密码错误'
default:
message = '登录成功'
}
res.json({
code: errCode,
message,
})
})