express官网
https://www.expressjs.com.cn/
这个翻译的版本比较好http://caibaojian.com/expressjs/index.html
npm init -y
安装 npm i express -S
创建server.js
一、基本路由
//server.js
const express = require('express')
const app = express()
// 查找
app.get('/', (req, res) => {
res.send('get')
})
// 添加
app.post('/', (req, res) => {
res.send('post')
})
// 修改
//put是全局修改
app.put('/', (req, res) => {
res.send('put')
})
//patch是局部修改
app.patch('/', (req, res) => {
res.send('patch')
})
// 删除
app.delete('/', (req, res) => {
res.send('delete')
})
//无论什么类型的请求都可以
app.all('/', (req, res) => {
res.send('all')
})
//动态路由
app.get('/index/:id/:name', (req, res) => {
console.log(req.params.id)
console.log(req.params.name)
res.send('match.')
})
app.listen(3000, () => {
console.log('localhost:3000')
})
同一个路由的简写方法
app.route('/')
.get((req, res) => {
res.send('get')
})
.post((req, res) => {
res.send('post')
})
二、中间件
1、必须有next才会执行下一个中间件的内容**
const controller1 = (req, res, next) => {
// res.send('users')
console.log('users')
req.users = 'users'//将controller1 中间件的内容传递给下一个中间件
next()
}
const controller2 = (req, res, next) => {
// res.send('roles')
console.log('roles')
next()
}
app.get('/users', [controller2, controller1], (req, res, next) => {
console.log(req.users)//使用req.users接收到controller1传递的内容
})
运行结果 roles users users
2、只要中间件栈匹配了就会往下执行
app.get('/', (req, res, next) => {
console.log(0)
next()
})
app.get('/', (req, res, next) => {
console.log(1)
})
打印结果0 1,如果没有next只会打印0
3、路由级中间件
router.use可以匹配任何请求的方式
const router = express.Router()
router.use('/',(req,res)=>{
//res.send('router')
next()
})
router.get('/user',(req,res,next)=>{
res.send('user')
})
app.use('/',router)
4、错误处理中间件
app.use(function(err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!');
})
5、内置中间件
静态资源中间件http://caibaojian.com/expressjs/starter/static-files.html
app.use(express.static('public'));
三、express生成器
通过应用生成器工具 express 可以快速创建一个应用的骨架
- 全局安装express生成器
npm install express-generator -g - 在当前工作目录下创建一个命名为 myapp 的应用,-e表示ejs
express -e myapp - 安装依赖
npm install
四、模板引擎的使用
1、ejs
- views, 放模板文件的目录,比如: app.set(‘views’, ‘./views’)
- view engine, 模板引擎,比如: app.set(‘view engine’, ‘ejs’)
安装ejs
npm i ejs -S
2、art-template
官网http://aui.github.io/art-template/express/
- 安装
npm install --save art-template
npm install --save express-art-template
var express = require('express');
var app = express();
// view engine setup
app.engine('art', require('express-art-template'));
app.set('view options', { //注意此处和官网不一样
debug: process.env.NODE_ENV !== 'production',
escape: false // 是个坑,转化HTML5代码
});
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'art');
// routes
app.get('/', function (req, res) {
res.render('index.art', {
user: {
name: 'aui',
tags: ['art', 'template', 'nodejs']
}
});
});
五、muter上传图片
https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md
- 安装
npm install --save multer - 使用
var express = require('express')
var multer = require('multer')
var upload = multer({ dest: 'uploads/' })
var app = express()
app.post('/profile', upload.single('avatar'), function (req, res, next) {
// req.file 是 `avatar` 文件的信息
// req.body 将具有文本域数据,如果存在的话
})
app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) {
// req.files 是 `photos` 文件数组的信息
// req.body 将具有文本域数据,如果存在的话
})
var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }])
app.post('/cool-profile', cpUpload, function (req, res, next) {
// req.files 是一个对象 (String -> Array) 键是文件名,值是文件数组
//
// 例如:
// req.files['avatar'][0] -> File
// req.files['gallery'] -> Array
//
// req.body 将具有文本域数据,如果存在的话
})