Skip to content

01了解express

01_express了解.js
js
const express = require('express')
//  createApplication
// 中间件
const app = express() //return function

// app.use

app.get('/', (req, res, next) => { 
    /**
     * request
     * 
     * response
     * 
     * next 用于执行下一个中间件函数
     *  调用栈中的下一个中间件
     * 
     * next or end
    */
    res.end('Welcome')
})

app.listen(8080, () => { 
    console.log('启动成功8080');
})

02 express 中间件

02_express中间件.js
js
const express = require('express');

const app = express();

// 按顺序 依次匹配 匹配all路径

// 编写普通的中间件
// app.use(function (req, res, next) {
//     console.log('第一个中间件');
//     // 周期中只可以有 一个end 周期事件 提前结束 next()不能有end方法
//     // res.end('hello world!');
//     next();
// })

// app.use(function (req, res, next) {
//     console.log('第二个中间件');
//     next();
// })

// app.use(function (req, res, next) {
//     console.log('第三个中间件');
//     res.end('简单的中间件')
// })



/**
 * 路径匹配中间件
 * 
 */

// app.use('/home',function (req, res, next) {
//     console.log('第一个带路径的中间件');
//     res.end('路径中间件')
// })


/**
 * 路径 &方法中间件
*/
// app.get('/login', function(req, res, next){
//     console.log('路径 & 方法中间件');
//     res.end('路径 & 方法中间件')
// })

/**
 * 注册多个中间件
 */

app.get('/logins', (req, res, next) => {
    console.log("注册多个中间件1");
    next();
}, (req, res, next) => {
    console.log("注册多个中间件2");
    res.end('注册多个中间件')
})

app.listen(8080, () => {
    console.log('8080启动成功');
})

03 express 应用

03_express应用.js
js
const express = require('express')
const multer = require('multer')
const path = require('path')

const app = express()

// app.use(function (req, res, next) { 
//     // 统一处理json
//     if (req.headers['content-type'] === 'application/json') { 
//         req.on('data', function (data) { 
//             const json = JSON.parse(data.toString())
//             if (!req.hasOwnProperty('body')) {
//                 req.body = {}
//             }
//             let info = { ...req.body, ...json }
//             req.body = info
//             console.log(info);

//         })
//     }
//     req.on('end', () => {
//         next()
//     })

// })

/**
 * body-parser express 3.x 内置
 * body-pasers express 4.x 移出
 * body-pasers express 4.16.x 内置成函数 类似功能
*/

app.use(express.json())

/**
 * extended 
 * true 对urlencoded 进行解析 使用 第三库 qs
 * false 对urlencoded 进行解析 使用 Nodejs内置函数 querystring
 * 
 * */

app.use(express.urlencoded({ extended: true }))

/**
 * formData
 * 安装multer
 * 调用 any方法 //解析非文件
 */

// const upload = multer()

// app.use(upload.any())


// app.post('/login', (req, res, next) => {
//     // 获取json
//     // req.on('data', (data) => {
//     //     console.log(data.toString());
//     // })
//     // req.on('end', () => { 
//     //     res.end('Welcome')
//     // })
//     // express
//     console.log('', req.body);
//     res.end('Welcome')

// })

/**
 * formdata
 * 上传文件 单文件
 * */
const uploads = multer({
    dest: './uploads/'
})

app.post('/uploads', uploads.single('file'), (req, res, next) => {
    console.log('获取文件信息', req.file)
    res.end('上传文件成功uploads')
})


const upload = multer({
    storage: multer.diskStorage({
        destination: (req, file, cb) => {
            cb(null, './uploads/')
        },
        filename: (req, file, cb) => {
            // 原始文件扩展名称
            cb(null, +new Date() + path.extname(file.originalname));
        }
    })
})

app.post('/upload', upload.array('file'), (req, res, next) => {
    console.log('获取文件信息', req.files)
    res.end('上传文件成功 upload')
})

/**
 * 保存日志信息
 * log morganWriteStream
*/
const morgan = require('morgan')
const fs = require('fs')

// 路径需要手动创建
const writeStream = fs.createWriteStream('./logs/access.log', { flags: "a+" })

// app.use(morgan("combined", { stream: writeStream }))

app.get('/log', morgan("combined", { stream: writeStream }),(req, res, next) => {
    res.end('输出日志')
})


/**
 * 数据传输query
 * 
*/
app.get('/query', (req, res, next) => {
    console.log(req.query);
    res.end('query')
})

/**
 * 数据传输params
*/

app.get('/parmas/:id', (req, res, next) => { 
    console.log(req.params);
    res.end('params')
})
app.listen(8080, () => {
    console.log('应用 8080');
})

04 express response对象

04_express响应.js
js
const express = require('express');

const app = express()
/** 
 * 返回数据 json格式
*/
app.get('/res', (req, res, next) => {
    // 传统方案
    // res.type('application/json') //设置 数据格式
    // res.end(JSON.stringify({name:'yhx',age:23}))

    // res.json
    res.json({ name: 'yhx', age: 23 })
    // res.json(['wang','li','liu'])
})

/**
 * 返回状态码
*/

app.get('/status', (req, res, next) => {
    // 传统方案
    // res.type('application/json') //设置 数据格式
    // res.end(JSON.stringify({name:'yhx',age:23}))

    // res.json、
    res.status(204)
    res.json({ name: 'yhx', age: 23 })
})
app.listen(8080, () => { 
    console.log('8080 服务启动成功'); 
})

05 express静态资源服务器

05_express静态资源服务器.js
js
/**
 * 静态资源服务部署
 * express.static
 * */ 
const express = require('express');


const app = express()
app.use('/static',express.static('./static/index.html'));
app.listen(8080, () => {
    console.log('静态资源启动');
})

06 express错误处理

06_express错误处理.js
js
/**
 * 错误处理
*/ 

const express = require('express');

const app = express()


app.get('/error', (req, res, next) => {
    // 带参数 则会进入 err
    next(new Error("ERROR 应该被返回的错误信息~~~~~~~~~~~~~~~~"))
 })

app.use((err, req, res, next) => {
    res.end(err.message)
 })
app.listen(8080, () => {
    console.log('router 路由已启动');
})

/**
 * 
 */

07 express路由

js
const express = require('express');

const userRouter = require('./user/index')

const app = express()

app.use('/user',userRouter)
app.listen(8080, () => { 
    console.log('router 路由已启动'); 
})
js
/**
 * express 路由
 * 一个 Router实例 拥有完整的 中间件和路由系统
 * mini-app (迷你应用程序) 
*/
const express = require('express')

const router = express.Router()

router.get('/',(req,res,next) => { 
    res.end('get')
})

router.post('/', (req, res, next) => {
    res.end('post')
})

router.delete('/', (req, res, next) => {
    res.end('delete')
})


router.put('/', (req, res, next) => {
    res.end('put')
})


module.exports = router