核心就是中间件
概念
- express 是TJ大神用Node.js封装的一个Web框架
- 核心概念是中间件
编程模型
- 使用
app.use(fn)
-
主要的api类型
express(内置的中间件)
内置的中间件,返回的是一个函数。比如express.json()
常用的
const app = express()
app.use('/xxx',fn)
app.get('/xxx',fn)
app.post('/xxx',fn)
app.router('/xxx').all(fn1).get(fn2)
next
next()
next(error)
- 自定义errorHandler
app.use((err,req,res,next) => {})
- next('route')
api
express
- 内置的中间件
- express.json //用于处理请求体为JSON的请求
app.use(express.json())
app.use('/xxx',(req,res,next) => {
console.log(req.body) //打印出来的是个JSON
})
//如果不写的话
app.use('/xxx',(req,res,next) => {
console.log(req.body) //打印出来的是个undefined
req.on('data',(chunk) => {
chunk.toString()
})
})
- express.static()
//获取当前目录下的public路径。注意:请求的时候就不需要带上/public这样的前缀了
app.use(express.static(path.join(__dirname, 'public')));
express.Router()
- 其他的
-
express.row()
//处理文件,二进制流 express.text()
express.urlencoded()
-
app
应用设置(模板配置、中间件、挂载路由)
-
app.locals
//设置变量
app.locals.title = '标题啦'
- set/get 优先推荐使用
app.locals
app.set('case sensitive routing',true)//大小写敏感
app.set('views', path.join(__dirname, 'views'));//渲染的位置
app.set('view engine','ejs') //注意是view,而不是views
app.get('env')
- app.get/post/put/delete
- app.render
app.render(view, [locals], callback)
app.use
-
request
req.get('请求头属性')
app.get('/get', (req, res, next) => {
console.log(req.get('User-Agent'));
next();
});
req.params
//axios.get('/get/1/nick')
app.get('/get/:id/:name', (req, res, next) => {
console.log(req.params); // {id:1 ,name: 'nick'}
next();
});
req.query
//axios.get('/get?age=18')
app.get('/get', (req, res, next) => {
console.log(req.query);// {age: 18}
res.send('hello ,this is get method');
next();
});
-
req.range()
//分片,服务器是否支持范围请求 -
response
res.range //用来分片
res.append与res.set res.append
-
res.append
是往里加,加同样的头都会保留 -
res.set
是往里面设置,设置同样的只能保留一个
res.set
- 分区
res.render()
/res.download()
// send the rendered view to the client
res.render('index')
// if a callback is specified, the rendered HTML string has to be sent explicitly
res.render('index', function (err, html) {
res.send(html)
})
// pass a local variable to the view
res.render('user', { name: 'Tobi' }, function (err, html) {
// ...
})
res.download('/report-12345.pdf')
res.download('/report-12345.pdf', 'report.pdf')
res.download('/report-12345.pdf', 'report.pdf', function (err) {
if (err) {
// Handle error, but keep in mind the response may be partially-sent
// so check res.headersSent
} else {
// decrement a download credit, etc.
}
})
res.send()
/ res.sendFile()
res.headersSent()
app.get('/', function (req, res) {
console.dir(res.headersSent) // false
res.send('OK')
console.dir(res.headersSent) // true
})
res.status()
res.status(403).end()
res.status(400).send('Bad Request')
res.status(404).sendFile('/absolute/path/to/404.png')
res.set()/res.get()
res.set('Content-Type', 'text/plain')
res.set({
'Content-Type': 'text/plain',
'Content-Length': '123',
ETag: '12345'
})
res.format()
res.format({
'text/plain': function () {
res.send('hey')
},
'text/html': function () {
res.send('hey
')
},
'application/json': function () {
res.send({ message: 'hey' })
},
default: function () {
// log the request and respond with 406
res.status(406).send('Not Acceptable')
}
})
res.send跟res.write 不能同时使用
- write是流式的操作
- send是一次性的
-
express.Router
- 就是一个阉割版的express
-