Express 框架开发web服务器
1. 最简单版本
var express = require('express');
var app = express();
app.get('/', (req, res, next) => {
res.send("welcome to express")
})
var server = app.listen(8080)
启动后打开 http://localhost:8080
2 中间件
Express 使用get/post/use(path,callback)中间件;第一个参数为路由,第二个参数为处理中的 callback既可以是router对象又可以是函数
-
2.1 将
app.use
第一个参数不设置,即可处理所有的消息:// 这里就是常用的网站维护,一般放在代码顶部。 app.use((req, res, next) => { if (webStop) res.send("维护中") else next() })
-
2.2 匹配404代码一般放在尾部,同样使用全部匹配。
app.use((req, res, next) => { res.send("404 - 页面不存在") // 页面不存在了 })
-
2.3 处理get请求querystring:
// GET /query?id=123 app.get('/query', (req, res, next) => { console.log(req.query) res.send(req.query) //{id:123} })
-
2.4 处理POST请求的BODY,需要使用
express.urlencoded
或者body-parser
(已废弃)// send by /index.html app.use(express.urlencoded({ extended: false })); // 这个中间件可以帮助解析req.body app.post('/login', (req, res) => { if (req.body.username == "abc" && req.body.password == '123') { res.redirect('/upload.html') return; } else { res.send(req.body.username + "不存在或者密码错误") } })
3 静态资源文件服务
使用中间件express.static
直接可以搞定》
app.use(express.urlencoded({ extended: false }));
//处理静态文件
// GET / 转换为 => public/index.html 默认打开Index.html
app.use(express.static("public", {
index: "index.html"
}));
// 或者下面这样:
// GET /static/xx 转换为 => public/xx,默认使用`/public/index.html`替换/static
app.use('/static', express.static("public", {
index: "index.html"
}));
4. express 错误处理
可以使用中间件处理:
app.get('/file', (req, res, next)=>{
fs.readFile('/a.txt', 'utf-8', (err, result)=>{
if (err)next(err) // 读取文件错误会传递给下面的中间件处理。
else res.send(result)
})
// 如果异步 readFile,可以使用try{...}catch(e){next(e)} 类似处理。
})
app.use((err, req, res, next)=>{
res.status(500).send(err.message)
})
5. express 模块路由
路由一般单独在文件夹如users
`order`下面,每个对应主文件中的路径形如:
const express = require('express');
let app = express();
app.listen(8080);
// 挂载两个路由到应用上
app.use('/users', require('./routes/users')); // 引入/routes/users文件夹下的index.js
app.use('/order', require('./routes/order'));// 引入/routes/order文件夹下的index.js
//404判断
app.use(function (req, res) {
res.send('404 not found');
});
其中routes目录下面放置应用的路由,其router\user入口文件index.js形如:
const express = require('express');
let router = express.Router();
router.get('/', function (req, res) {
res.send('用户首页');
});
router.get('/:id', function (req, res) {
res.send(`${req.params.id} 用户信息`);
});
//导出该路由
module.exports = router;
当访问http://localhost:8080/user时,会跳转到user/index.js里面的 /
进行处理。另外,Router是可以嵌套的,如果你想划分的更细,一个子路由还以引用子子路由,不断分下去。
路由参数
// GET http://localhost:3000/user/id/name/age // 后台对应课获取 /user/:id/:name/:age router.get('/user/:id', function (req, res) { res.send(`${req.params.id} user首页`); // 返回为{id,name,age} });