框架

expressopen in new window

路由

创建服务器,并会对 / 路径响应,支持原生的 res.write() 写法, res.send() 接受 HTML 和对象

const app = express()

app.get('/', (req, res) => {
    res.send('this is express')
})

app.listen(3000, () => {
    console.log('server start')
})

提供了一些占位符来响应某些特定的路由

app.get('/ab?cd', (req, res) => {
    res.send('/abcd|/acd')
})

app.get('/ab/:id', (req, res) => {
    res.send('/ab/xx')
})

app.get('/ab+cd', (req, res) => {
    res.send('/abbbbbcd')
})

app.get('/ab*cd', (req, res) => {
    res.send('/abfkesuhcd')
})

app.get('/ab(cd)?e', (req, res) => {
    res.send('/abcde|/abe')
})

当然也支持正则表达式

app.get(/api$/, (req, res) => {
    res.send('/xxapi')
})

中间件

路径后面的函数称之为中间件,也就是在响应内容之前做一些事情,中间件可以有多个,通过 next() 来继续

app.get(
    '/home',
    (req, res, next) => {
        const isValid = true
        if (isValid) {
            next()
        } else {
            res.send('fail')
        }
    },
    (req, res) => {
        res.send({ result: [] })
    }
)

或者将它们分离出来,传入一个数组代替

const check = (req, res, next) => {
    const isValid = true
    if (isValid) {
        next()
    } else {
        res.send('fail')
    }
}

const back = (req, res) => {
    res.send({ result: [] })
}

app.get('/list', [check, back])

应用级中间件

以上都可以算是应用级中间件,直接挂载在 express()

如果要在所有中间件前添加一个中间件可以这样


app.use((req, res, next) => {
    console.log('before all')

    next()

路由级中间件

通过 express.Router() 创建一个路由,然后在这个路由上挂载中间件

const router = express.Router()

router.get('/a', (req, res) => {
    res.send('a')
})

接着可以将它导出,然后在 express() 上使用

app.use('/', router)

通过路由级中间件,我们可以把路由进行更细致的划分,比如将 api 统一管理

const router = express.Router()

router.get('/a', (req, res) => {
    res.send('a')
})

router.get('/b', (req, res) => {
    res.send('b')
})
const app = express()

app.use('/api', router)
// /api/a /api/b