koa框架

这篇具有很好参考价值的文章主要介绍了koa框架。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


koa是由Express原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的Web框架。使用koa编写web应用,通过组合不同的generator,可以免除重复繁琐的 回调函数嵌套 ,并极大地提升错误处理的效率。koa不在内核方法中绑定任何中间件,它仅仅提供了-个轻量优雅的函数库,使得编写Web应用变得得心应手。

koa和express的区别

  • Koa采用洋葱模型
    通常都会说Koa是洋葱模型,这重点在于中间件的设计。但是按照上面的分析,会发现Express也是类似的,不同的是Express中间件机制使用了Callback 实现,这样如果出现异步则可能会使你在执行顺序上感到困惑,因此如果我们想做接口耗时统计、错误处理Koa的这种中间件模式处理起来更方便些。最后一点响应机制也很重要,
    Koa不是立即响应,是整个中间件处理完成在最外层进行了响应,而Express则是立即响应。

  • Koa更轻量
    koa不提供内置的中间件;
    koa不提供路由,而是把路由这个库分离出来了(koa/router)

  • Context对象
    koa增加了一个Context的对象,作为这次请求的上下文对象(在koa2中作为中间件的第一个参数传入)。同时Context上也挂载了Request和Response两个对象。Express类似, 这两个对象都提供了大量的便捷方法辅助开发这样的话对于在保存一些公有的参 数的话变得更加合情合理。

  • 异步流程控制
    express采用callback来处理异步,koa采用async/await。
    async/await使用同步的写法来处理异步,明显好于callback和promise,

  • 中间件模型
    express基于connect中间件,线性模型;
    koa中间件采用洋葱模型(对于每个中间件,在完成了-些事情后,可以非常优雅的将控制权传递给下一个中间件,并能够等待它完成,当后续的中间件完成处理后,控制权又回到了自己)

koa框架
代码示例:

同步代码

同步方法没有什么区别:

  • 01-express-同步.js
const express = require("express")
const app = express()

app.use((req, res, next) => {
    console.log("111111")
    next()
    console.log("333333")
    res.send("hello world")
})

app.use((req, res, next) => {
    // 同步操作
    console.log("22222")
})

app.listen(3000)

运行输出

111111
22222
333333
  • 01-koa-同步 .js
const Koa = require("koa")
const app = new Koa()

app.use((ctx, next) => {
    console.log("111111")
    next()
    console.log("333333")
    ctx.body("hello world")
})

app.use((ctx, next) => {
    // 同步操作
    console.log("22222")
})

app.listen(3000)

运行输出:

111111
22222
333333

异步代码

next()表示可以执行下一个中间件,当下一个中间件执行完成之后,如果上一个中间件没有执行完,再返回上一个中间件继续执行。

01-express-异步.js

const express = require("express")
const app = express()

app.use(async (req, res, next) => {
    console.log("111111")
    await next()
    console.log("444444")
    res.send("hello world")
})

app.use(async (req, res, next) => {

    console.log("22222")
     // 异步操作
    await delay(1000)
    console.log("33333")
})

function delay(time) {
    return new Promise((resolve, reject) => {
        setTimeout(resolve,time)
    })
}

app.listen(3000)

运行输出:

111111
22222
444444
33333

由于next()返回的不是promise对象因此await不起作用,所以输出不会像我们所想输出

  • 01-koa-异步.js
const Koa = require("koa")
const app = new Koa()

app.use((ctx, next) => {
    console.log("111111")
    next()
    console.log("444444")
})

app.use((ctx, next) => {
    console.log("22222")
    // 异步操作
    delay(1000)
    console.log("33333")
})

function delay(time) {
    return new Promise((resolve, reject) => {
        setTimeout(resolve,time)
    })
}
app.listen(3000)

运行输出:

111111
22222
33333
444444

koa洋葱模型,正常执行。

koa下载安装

  • npm init
  • npm i koa
  • Koa基本框架
const Koa = require("koa")

const app = new Koa()

// ctx=context 相当于res和req的合并
app.use((ctx, next) => {
    
})

app.listen(3000)

koa的基本使用

  • ctx
    ctx.req//node原生的request对象
    ctx.res//node原生的response对象
    cts.request//koa封装好的的request对象
    cts.response//koa封装好的的response对象
  • 向返回数据到前端页面
    ctx.response.body = 返回的内容
       // 返回代码片段
    ctx.response.body = "<b>hello world</b>"
    // 返回json数据
    ctx.response.body = { name: "yang", age: 18 }

但是后面返回的会覆盖前面返回的

  • 获取请求路径
    ctx.request.path
 console.log(ctx.request.path)
  • 注: ctx.request.path可以简写成 ctx.path
    ctx的多数方法都可以省去request 和 response。

koa的路由

koa中没有路由,需要下载另一个模块

  • 下载:npm i koa-router
  • 使用:
const Koa = require("koa")
const Router = require("koa-router")

const app = new Koa()
const router = new Router()

router.get("/list",(ctx, next) => {
   ctx.body = ["111","222","333"]
})

// 注册路由
app.use(router.routes())
// 当请求方法错误时(比如需要get请求发成了post请求),提示相应错误
app.use(router.allowedMethods())

app.listen(3000)
  • 路由实现增删改查
const Koa = require("koa")
const Router = require("koa-router")

const app = new Koa()
const router = new Router()

router.post("/list",(ctx, next) => {
    ctx.body = {
        ok: 1,
        info:"add list success"
   }
})

router.get("/list",(ctx, next) => {
   ctx.body = ["111","222","333"]
})

router.put("/list/:id", (ctx, next) => {
    console.log(ctx.params)
    ctx.body = {
        ok: 1,
        info:"put list success"
    }
})

router.del("/list/:id", (ctx, next) => {
    ctx.body = {
        ok: 1,
        info:"del list success"
    }
})

// 注册路由
app.use(router.routes())
// 当请求方法错误时(比如需要get请求发成了post请求),提示相应错误
app.use(router.allowedMethods())

app.listen(3000)
  • 路由文件拆分,紫萼在一根文件中太乱了,不同的请求应该放在不同的路由文件中,然后进行引入。
    koa框架
    index.js:
const Koa = require("koa")
const Router = require("koa-router")

const app = new Koa()
const router = new Router()
const userRouter = require("./routes/user")
const listRouter = require("./routes/list")

// 先注册路由级组件
router.use("/user", userRouter.routes(),userRouter.allowedMethods())
router.use("/list",listRouter.routes(),listRouter.allowedMethods())

// 再注册应用级组件
app.use(router.routes())
// 当请求方法错误时(比如需要get请求发成了post请求),提示相应错误
app.use(router.allowedMethods())

app.listen(3000)

user.js

const Router = require("koa-router")

const router = new Router()

router.post("/",(ctx, next) => {
    ctx.body = {
        ok: 1,
        info:"add user success"
   }
})

router.get("/",(ctx, next) => {
   ctx.body = ["111","222","333"]
})

router.put("/:id", (ctx, next) => {
    console.log(ctx.params)
    ctx.body = {
        ok: 1,
        info:"put user success"
    }
})

router.del("/:id", (ctx, next) => {
    ctx.body = {
        ok: 1,
        info:"del user success"
    }
})

module.exports = router

list.js

const Router = require("koa-router")

const router = new Router()

router.post("/",(ctx, next) => {
    ctx.body = {
        ok: 1,
        info:"add list success"
   }
})

router.get("/",(ctx, next) => {
   ctx.body = ["111","222","333"]
})

router.put("/:id", (ctx, next) => {
    console.log(ctx.params)
    ctx.body = {
        ok: 1,
        info:"put list success"
    }
})

router.del("/:id", (ctx, next) => {
    ctx.body = {
        ok: 1,
        info:"del list success"
    }
})

module.exports = router
  • 也可以将 index.js中的 注册路由级组件 提出来
    user.js和list.js不用修改,再router下新建index.js

koa框架
index.js

const Koa = require("koa")
const app = new Koa()
const router = require("./routes")

// 再注册应用级中间件
app.use(router.routes())
// 当请求方法错误时(比如需要get请求发成了post请求),提示相应错误
app.use(router.allowedMethods())

app.listen(3000)

router/index.js:

const Router = require("koa-router")
const router = new Router()
const userRouter = require("./user")
const listRouter = require("./list")
// 统一加前缀
router.prefix("/api")

// 先注册路由级中间件
router.use("/user", userRouter.routes(),userRouter.allowedMethods())
router.use("/list", listRouter.routes(), listRouter.allowedMethods())

module.exports = router
  • router统一加前缀
// 统一加前缀
router.prefix("/api")
  • 路由的重定向
router.use("/home", homeRouter.routes(), homeRouter.allowedMethods())
router.redirect("/","/home")//重定向

表示当访问更目录时会自动成定向到/home.

koa静态资源

  • 安装模块: npm i koa-static
  • 引入模块,配置静态资源:
    index.js:
const Koa = require("koa")
const app = new Koa()
const static = require("koa-static")
const path= require("path")

// 先注册路由级中间件
const router = require("./routes")

// 再注册应用级中间件
app.use(router.routes())
app.use(static(path.join(__dirname,"public")))
// 当请求方法错误时(比如需要get请求发成了post请求),提示相应错误
app.use(router.allowedMethods())

app.listen(3000)
  • 例子:
    koa框架
    center.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- href="css/center.css" 路径前面不要加前缀路径,因为在index.js中配置好了,静态资源会自动去public文件夹下寻找-->
    <link rel="stylesheet" href="/css/center.css"/>
</head>
<body>
    <div>
        center
    </div>
</body>
</html>

center.css

div{
    background-color: brown;
}

运行访问:http://localhost:3000/center.html
koa框架

koa获取请求参数

get请求参数获取

在koa中,获取GET请求数据源头是koa中request对象中的query方法或querystring方法。
query返回是 格式化好的参数对象,
querystring返回的是请求字符串,
由于ctx对request的API有 直接引用的方式,所以获取GET请求数据有两个途径:

  • 从上下文中直接获取:
    请求对象ctx.query,返回如{ a:1, b:2 }
    请求字符串ctx.querystring,返回如a=1&b=2
  • 是从上下文的request对象中获取:
    请求对象ctx.request.query,返回如{ a:1, b:2 }
    请求字符串ctx.request.querystring,返回如a=1&b=2

post请求参数获取

对于POST请求的处理,koa-bodyparser中间件可以把koa上下文的formData数据解析到ctx.request.body

  • 配置注册模块
const bodyParser = require('koa-bodyparser')
//使用ctx.body解析中间件
app.use(bodyParser())
  • 获取
    ctx.request.body(不能简写)

输出:eg:

{ username: 'bbb', password: '123456' }

koa的ejs模板

  • 需要安装两个模块
    npm install --save koa-views
    npm install --save ejs
  • 模板配置
const views = require("koa-views")
// 配置模板引擎,将ejs模板文件放在views文件夹下
app.use(views(path.join(__dirname,"views"),{extension:"ejs"}))
  • 模板使用
    /home请求
const Router = require("koa-router")

const router = new Router()

router.get("/", async (ctx, next) => {
    // 是异步的,需要等待模板解析完成之后再返回页面
    await ctx.render("home",{username:"yang"})// 自动去views下找home.ejs(入口index.js中配置了)
})

module.exports = router

home.ejs

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Home</h1>
    <h2>欢迎<%=username%>回来</h2>
</body>
</html>

输出:
koa框架

koa- 登录鉴权

cookie和session

koa-cookie

koa提供了从上下文直接读取、写入cookie的方法

  • ctx.cookies.get(name, [options])读取上下文请求(前端)中的cookie
  • ctx.cookies.set(name, value, [options])在上下文中写入cookie

koa-session

  • 需要下载模块koa-session-minimal
    npm i koa-session-minimal
  • 模块配置
    index.js:
    拦截
const Koa = require("koa")
const app = new Koa()
const static = require("koa-static")
const path = require("path")
const bodyParser = require('koa-bodyparser')
const views = require("koa-views")
const session = require("koa-session-minimal")

// 先注册路由级中间件
const router = require("./routes")

//使用ctx.body解析中间件,获取post参数
app.use(bodyParser())
// 配置静态资源
app.use(static(path.join(__dirname,"public")))
// 配置模板引擎
app.use(views(path.join(__dirname, "views"), { extension: "ejs" }))
// session配置
app.use(session({
    // 设置钥匙
    key: "yangsessionId",
    cookie:{
        maxAge:1000*60
    }
}))

// session判断拦截
app.use(async (ctx, next) => {
    if (ctx.url.includes("login")) {
        await next()
        return 
    }
    if (ctx.session.user) {
        ctx.session.date = Date.now()
        await next()
    }else{
        ctx.redirect("/login")
    }
})


// 再注册应用级中间件
app.use(router.routes())
app.use(router.allowedMethods())



app.listen(3000)

登陆时设置session

router.post("/login", (ctx) => {
    console.log(ctx.request.body)
    const { username, password } = ctx.request.body
    if (username === 'yang' && password === "123456") {

        // 登陆成功设置session,给session赋值
        ctx.session.user = {
            username:"yang"
        }
        ctx.body = {
            ok: 1,
        }
    } else {
        ctx.body = {
            ok: 0,
        }
    }
    
})

JWT

  • JWT模块
    util/JWT.js:
var jwt = require("jsonwebtoken")
const secret ='yang-secret'

const JWT = {
    // 加密
    generate(value,expires) {
        return jwt.sign(value,secret,{expiresIn:expires})
    },
    // 解密
    verify(token) {
        try {
            return jwt.verify(token, secret)
        } catch (error) {
            return false
        }
    }
}


module.exports = JWT
  • 登陆成功设置token
router.post("/login", (ctx) => {
    console.log(ctx.request.body)
    const { username, password } = ctx.request.body
    if (username === 'yang' && password === "123456") {

        // 登陆成功设置token,插入到header中
        const token = JWT.generate({
            _id: "123456",
            username:"yang"
        }, "10s")
        // 将token返回在header中
        ctx.set("Authorization",token)

        ctx.body = {
            ok: 1,
        }
    } else {
        ctx.body = {
            ok: 0,
        }
    }
    
})
  • login.ejs
    登录成功将token设置在前端页面上:(axios拦截器)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <script type='text/javascript'>
        // 拦截器
        // 请求发出前执行的方法
      axios.interceptors.request.use(function (config) {
          console.log("请求发出前执行的方法")
          return config;
        }, function (error) {
         
          return Promise.reject(error);
      });
        // 请求成功之后第一个调用的方法
      axios.interceptors.response.use(function (response) {
            console.log("请求成功之后第一个调用的方法")
            const {authorization} = response.headers
            authorization && localStorage.setItem("token",authorization)
            return response;
          }, function (error) {
            
            return Promise.reject(error);
      });
    </script>
</head>
<body>
    <h1>登录界面</h1>
    <div>
        <div>用户名:<input id="username" /></div>
        <div>密码:<input type="password" id="password" /></div>
        <div><button id="login">登录</button></div>
    </div>

    <script type='text/javascript'>
        var login = document.querySelector("#login");
        var username = document.querySelector("#username");
        var password = document.querySelector("#password");

        login.onclick = () => {
          axios.post("/user/login",{
            username: username.value,
            password: password.value
          }).then(res=>{
            if(res.data.ok==1){
              console.log(res.data)
              // 存储token(拉杰其直接进行了存储)
              location.href="/"
            }else{
                console.log(res)
                alert("用户名密码错误")
            }
          })
      };

    </script>
</body>
</html>
  • index.js

响应请求之前先判断token是否过期

const Koa = require("koa")
const app = new Koa()
const static = require("koa-static")
const path = require("path")
const bodyParser = require('koa-bodyparser')
const views = require("koa-views")
const session = require("koa-session-minimal")
const JWT = require("./utils/jwt")

// 先注册路由级中间件
const router = require("./routes")

//使用ctx.body解析中间件,获取post参数
app.use(bodyParser())
// 配置静态资源
app.use(static(path.join(__dirname,"public")))
// 配置模板引擎
app.use(views(path.join(__dirname, "views"), { extension: "ejs" }))

// token判断拦截
app.use(async (ctx, next) => {
    if (ctx.url.includes("login")) {
        await next()
        return
    }

    const token = ctx.headers["authorization"]?.split(" ")[1]
    if (token) {
        const payload = JWT.verify(token)
        if (payload) {
            // 重新计算token的过期时间
            const newToken = JWT.generate({
                _id: payload._id,
                username: payload.username
            }, "1d")
            // 将token返回在header中
            ctx.set("Authorization",token)
            
            await next()
        } else {
            ctx.status = 401,
            ctx.body = {errCode:-1,errInfo:"token过期"}
        }
    } else {
        await next()
    }
})

// 再注册应用级中间件
app.use(router.routes())
app.use(router.allowedMethods())



app.listen(3000)
  • home.ejs:
<!DOCTYPE html>
<html>
  <head>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <script type='text/javascript'>
        // 拦截器
        // 请求发出前执行的方法
      axios.interceptors.request.use(function (config) {
          console.log("请求发出前执行的方法")
          // 将token给后端
          const token = localStorage.getItem("token")
          // config是请求对象,可以传递给后端,Bearer 是规范
          config.headers.Authorization = `Bearer ${token}`
          return config;
        }, function (error) {
         
          return Promise.reject(error);
      });
        // 请求成功之后第一个调用的方法
      axios.interceptors.response.use(function (response) {
            console.log("请求成功之后第一个调用的方法")
            const {authorization} = response.headers
            authorization && localStorage.setItem("token",authorization)
            return response;

            if(response.data.ok==0){
              location.href="/login"
            }
          }, function (error) {
            console.log("请求成功之后第一个调用的方法err")
            console.log(error.response.status)
            if(error.response.status===401){
              localStorage.removeItem("token")
              location.href="/login"
            }
            return Promise.reject(error);
      });
      </script>
      <style>
        td img{
          width: 80px;
          height: 80px;
        }
      </style>
  </head>
  <body>
    <div>
      <h1>后台管理系统
        <button id="exit">退出登录</button>
        </h1>
      <br />
      <table border="1">
        <thead>
          <tr>
            <td>id</td>
            <td>用户</td>
            <td>年龄</td>
          </tr>
        </thead>
        <tbody></tbody>
      </table>
    </div>
    <script type="text/javascript">
      var exit = document.querySelector("#exit");


      axios.get("/home/list").then((res) => {
           res = res.data
            console.log(res);
            var tbody = document.querySelector("tbody");
            // map映射
            tbody.innerHTML = res
              .map(
                (item) => `
              <tr>
                <td>${item._id}</td>
                <td>${item.username}</td>
                <td>${item.age}</td>
              </tr>
              `
              )
              .join("");
        })


      exit.onclick = ()=>{
        // 直接移除前端的token
       localStorage.removeItem("token") 
        location.href="/login"
     
      }
    </script>
  </body>
</html>

koa 文件上传

  • 安装 multer 和@koa/multer
    npm install --save @koa/multer multer
    用法和Express的multer一样。

  • 模块配置

const multer = require("@koa/multer")
// 文件存储地址
const upload = multer({dest:"public/uploads"})

// upload.single("avatar"):接收文件
router.post("/upload", upload.single("avatar"),(ctx) => {
    console.log(ctx.request.body,ctx.file)
    ctx.body={ok:1}
})

koa 操作MongoDB

  • 下载模块:npm i mongoose
  • 启动MongoDB
  • 在vscode中配置mongoDB
    koa框架
    db.config.js:
// 连接数据库
const mongoose = require("mongoose")

mongoose.connect("mongodb://127.0.0.1:27017/yang_project")
// 插入集合和数据,yang_project会自动创建

  • index.js引入
// 链接数据库
require("./config/db.config")
  • 向数据库中存数据
// upload.single("avatar"):接收文件
router.post("/upload", upload.single("avatar"),async (ctx) => {
    console.log(ctx.request.body, ctx.file)
    
    const { username, password, age } = ctx.request.body
    const avatar = ctx.file ? `/uploads/${ctx.file.filename}` : `/uploads/9f774d77e9072c2912efb7528249db42`
    
    // 利用UserModel模型进行存储操作 UserModel.create
    await UserModel.create({
        username,
        age,
        password,
        avatar
    })


    ctx.body={ok:1}
})

代码获取:
链接:https://pan.baidu.com/s/1rzovC9h5Nl3lc-XXvRdptw?pwd=xtfx
提取码:xtfx文章来源地址https://www.toymoban.com/news/detail-444510.html

到了这里,关于koa框架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • node中间件-koa框架

    安装 npm i koa koa导出的是一个类,必须用 new 进行创建 koa也是通过注册中间件来完成请求操作的 koa注册的中间件提供了两个参数: ctx:上下文(Context)对象; koa并没有像express一样,将req和res分开,而是将它们作为ctx的属性; ctx代表一次请求的上下文对象; ctx.reque

    2024年02月16日
    浏览(53)
  • node笔记_koa框架是什么?

    大家好,我是yma16,本文介绍node的一个web框架koa。 往期文章 node_windows环境变量配置 node_npm发布包 linux_配置node

    2024年02月07日
    浏览(46)
  • 【node进阶】一文带你快速入门koa框架

    ✅ 作者简介:一名普通本科大三的学生,致力于提高前端开发能力 ✨ 个人主页:前端小白在前进的主页 🔥 系列专栏 : node.js学习专栏 ⭐️ 个人社区 : 个人交流社区 🍀 学习格言: ☀️ 打不倒你的会使你更强!☀️ 💯 刷题网站:这段时间有许多的小伙伴在问有没有什么

    2024年01月22日
    浏览(55)
  • 【node进阶】浅析Koa框架---ejs模板|文件上传|操作mongoDB

    ✅ 作者简介:一名普通本科大三的学生,致力于提高前端开发能力 ✨ 个人主页:前端小白在前进的主页 🔥 系列专栏 : node.js学习专栏 ⭐️ 个人社区 : 个人交流社区 🍀 学习格言: ☀️ 打不倒你的会使你更强!☀️ 💯 刷题网站:这段时间有许多的小伙伴在问有没有什么

    2024年01月25日
    浏览(46)
  • 从0开发属于自己的nestjs框架的mini 版 —— koa-decorator路由篇

    这篇主要是实现路由注解,用过nestjs的都知道,其路由都是通过注解来实现的,如有控制器@Controller(),@Get()...等等,nestjs 底层框架可选 是expres或者是Fastify,在这里我选择 koa2。 话不多说,直接上代码 src/koa-decorator.ts 引入相关库 类型声明 常量声明 类控制装饰器 类方法装饰

    2024年02月15日
    浏览(36)
  • express框架中间件

    说明:Express框架中间件是指在处理HTTP请求前或后对请求和响应进行处理的函数。具体而言,中间件可以: 执行一些公共的逻辑,比如身份验证、日志记录、错误处理等。 修改请求和响应,比如缓存、压缩等。 控制请求流,比如路由控制、URL重定向等。 Express中间件可以是一

    2024年02月13日
    浏览(35)
  • 八、Express框架 安装

             对于Express框架的就不进行过多介绍,Express官方对该框架的定位是:\\\"基于Node.js平台,快速、开放、极简的 Web 开发框架\\\",本篇开始记录关于 Node.js 轻量级Web开发框架 :Express框架,下面先进行Express框架的安装:         Express安装主分两种:1. 局部安装 ;2. 全局

    2024年02月08日
    浏览(68)
  • Express 框架介绍

    目录 1、简介 1.1 Web 应用 1.2 API 1.3 性能 1.4 框架 2、如何开始 Express 编程之旅 3、测试实例 4、其他问题 4.1 如何定义模型? 4.2 Express 支持哪些模板引擎? 4.3 如何处理 404 响应? 4.4 如何设置错误处理程序?  4.5 如何渲染纯 HTML? Express  是快速、独立、极简的Node.js Web框架。

    2024年02月16日
    浏览(30)
  • Express框架使用全流程

    对于像我这样不常使用 Node.js 进行开发的人来说,每次开始一个新项目都意味着从头开始设置环境,这个过程相当繁琐。因此,我决定自己构建一个开箱即用的项目脚手架。我的目标是创建一个简单易用的基础框架,能让我(和任何人)直接投入日常的开发工作,无需预先的

    2024年01月17日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包