• 【小慕读书】—— 后台管理系统学习:后端框架搭建


    前言:最近在学习Vue+Element UI+Node.js小慕读书中后台管理系统开发课程,这里对学习过程作个笔记,方便自己和大家翻阅。


     一、Node 简介

    • Node 是一个基于 V8 引擎的 Javascript 运行环境,它使得 Javascript 可以运行在服务端,直接与操作系统进行交互,与文件控制、网络交互、进程控制等
    • 与Chrome的区别:Chrome 浏览器同样是集成了 V8 引擎的 Javascript 运行环境,与 Node 不同的是他们向 Javascript 注入的内容不同,Chrome 向 Javascript 注入了 window 对象,Node 注入的是 global,这使得两者应用场景完全不同,Chrome 的 Javascript 所有指令都需要通过 Chrome 浏览器作为中介实现

    二、Express 简介

    • express 是一个轻量级的 Node Web 服务端框架,同样是一个人气超高的项目,它可以帮助我们快速搭建基于 Node 的 Web 应用

    三、项目初始化

    创建项目

    mkdir admin-imooc-node
    cd admin-imooc-node
    npm init -y

    安装依赖  

    npm i -S express

    创建 app.js  

    const express = require('express')
    
    // 创建 express 应用
    const app = express()
    
    // 监听 / 路径的 get 请求
    app.get('/', function(req, res) {
      res.send('hello node')
    })
    
    // 使 express 监听 5000 端口号发起的 http 请求
    const server = app.listen(5000, function() {
      const { address, port } = server.address()
      console.log('Http Server is running on http://%s:%s', address, port)
    })

      

    四、Express 三大基础概念

    中间件

    中间件是一个函数,在请求和响应周期中被顺序调用

    1.next()一定要调用,否则中间件是不会继续向下执行的

    2.中间件一定要在请求发起之前执行,否则中间件就执行不到了

    // 前置中间件:跨域、日志等操作
    function myLogger(req, res, next){
        console.log('myLogger')
        next()         
    }
    
    app.use(myLogger)  //中间件需要在响应结束前被调用
    
    /**********************************************************/
    
    // 监听 / 路径的 get 请求
    app.get('/', function(req, res) {
      res.send('hello node')
    })

    路由

    应用如何响应请求的一种规则

    1.响应 / 路径的 get 请求:

    app.get('/', function(req, res) {
      res.send('hello node')
    })

    2.响应 / 路径的 post 请求: 

    app.post('/', function(req, res) {
      res.send('hello node')
    })
    

    规则主要分两部分:

    • 请求方法:get、post......
    • 请求的路径:/、/user、/.*fly$/......

    异常处理

    通过自定义异常处理中间件处理请求中产生的异常  

    // 监听 / 路径的 get 请求
    app.get('/', function(req, res) {
        //请求响应res已经被响应到,当响应结束,不会执行中间间
        throw new Error('something has error...')
    })
    
    /***********************************************************?
    
    // 后置中间件:异常处理
    // 后置原因: 前面的throw new Error会寻找后面的errorHandler,倒置则找不到
    function errorHandler(err, req, res, next){
        console.log(err)
        res.status(500).json({
            error: -1,
            msg: err.toString()
        })
    }
    
    app.use(errorHandler)
    

    使用时需要注意两点:

    • 第一,参数一个不能少,否则会视为普通的中间件
    • 第二,中间件需要在请求之后引用

      

    五、项目框架搭建

    路由

    安装 boom 依赖: (最大的好处:快速生成异常信息)

    npm i -S boom

    创建 router 文件夹,创建 router/index.js:(用来处理全局的异常)  

    const express = require('express')
    const boom = require('boom')
    const userRouter = require('./user')
    const {
      CODE_ERROR
    } = require('../utils/constant')
    
    // 注册路由
    const router = express.Router()
    
    router.get('/', function(req, res) {
      res.send('欢迎学习小慕读书管理后台')
    })
    
    // 通过 userRouter 来处理 /user 路由,对路由处理进行解耦
    router.use('/user', userRouter)
    
    /**
     * 集中处理404请求的中间件
     * 注意:该中间件必须放在正常处理流程之后
     * 否则,会拦截正常请求
     */
    router.use((req, res, next) => {
      next(boom.notFound('接口不存在'))
    })
    
    /**
     * 自定义路由异常处理中间件
     * 注意两点:
     * 第一,方法的参数不能减少
     * 第二,方法的必须放在路由最后
     */
    router.use((err, req, res, next) => {
      const msg = (err && err.message) || '系统错误'
      const statusCode = (err.output && err.output.statusCode) || 500;
      const errorMsg = (err.output && err.output.payload && err.output.payload.error) || err.message
      res.status(statusCode).json({
        code: CODE_ERROR,
        msg,
        error: statusCode,
        errorMsg
      })
    })
    
    module.exports = router
    

    修改app.js 

    const express = require('express')
    const router = require('./router')
    
    // 创建 express 应用
    const app = express()
    
    app.use('/', router)
    
    // 监听 / 路径的 get 请求
    //app.get('/', function(req, res) {
    //    res.send('hello node')
    //})
    
    // 使 express 监听 5000 端口号发起的 http 请求
    const server = app.listen(5000, function() {
        const { address, port } = server.address()
        console.log('Http Server is running on http://%s:%s', address, port)
    })  

    创建 router/use.js: 

    const express = require('express')
    
    const router = express.Router()
    
    router.get('/info', function(req, res, next) {
      res.json('user info...')
    })
    
    module.exports = router
    

    创建 utils/constant:  

    module.exports = {
      CODE_ERROR: -1
    }
    

    验证 /user/info:(路由嵌套)

    验证 /user/login:  


    注:项目来自慕课网  

    人与人的差距是:每天24小时除了工作和睡觉的8小时,剩下的8小时,你以为别人都和你一样发呆或者刷视频
  • 相关阅读:
    C#读写txt文件的两种方法介绍
    C#委托的介绍(delegate、Action、Func、predicate)
    C#邮件发送
    ASP.NET 文件上传于下载
    关于Virtual Box虚拟机里的系统不能启动的解决方法
    unity的yield
    unity文件路径
    手机上的unity路径
    readonly
    unity延迟加载图片
  • 原文地址:https://www.cnblogs.com/ljq66/p/14353433.html
Copyright © 2020-2023  润新知