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.1app.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}
});