Skip to content
Netflix - 每月低至 25 元

Koa

初始化项目

  1. 全局安装脚手架

    sh
    npm install -g koa-generator
  2. 使用脚手架创建项目

    sh
    koa2 my-koa
  3. 安装依赖以及 cross-env

    sh
    npm install
    npm install cross-env -D
  4. 修改 package.json 中的 dev 脚本

    json
    // 添加 cross-env NODE_ENV=dev
    "dev": "cross-env NODE_ENV=dev ./node_modules/.bin/nodemon bin/www"
  5. 移除多余中间件及目录

    • views 文件夹
    • public 文件夹中的 javascriptsstylesheets
    • koa-views 中间件

解决跨域

  1. 安装 koa2-cors

  2. app.js 中使用

    js
    const cors = require('koa2-cors');
    
    app.use(
      cors({
        origin(ctx) {
          return '*';
        },
        maxAge: 5,
        credentials: true,
        allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
        allowHeaders: ['Content-Type', 'Authorization', 'Accept'],
        exposeHeaders: ['WWW-Authenticate', 'Server-Authorization']
      })
    );

Form-Data 与 Files

  • 脚手架默认安装的 koa-bodyparser 无法获取 Form-Data 的数据

  • 添加 koa2-formidable 即可获取 Form-Data 的数据

  • Form-Data 中的文件会自动存放在指定的路径中

    js
    const formidable = require('koa2-formidable');
    
    // 指定保存的路径、是否保存扩展名等
    app.use(formidable({ multiples: true, uploadDir: path.join(__dirname, 'public', 'images'), keepExtensions: true }));
    
    // 获取文件
    ctx.request.files

JWT

  1. 安装 koa-jwt

  2. 生成 token

    js
    // koa-jwt中内置jsonwebtoken,无需单独安装
    const jwt = require('jsonwebtoken');
    
    // 参数1:token 存储的内容
    // 参数2:密钥
    // 参数3:过期时间
    const token = jwt.sign({ userId: user[0]._id },'IHS9794Nis',{ expiresIn: '12h' });
  3. tokentoken 过期时,返回401

    js
    app.use((ctx, next) => {
      return next().catch((err) => {
        if (err.status === 401) {
          ctx.status = 401;
          ctx.body = '请先登录';
        } else {
          throw err;
        }
      });
    });
  4. 使用 koa-jwt 验证 token

    js
    const koajwt = require('koa-jwt');
    const SECURT_KEY = 'IHS9794Nis';
    
    // 密钥需与加密时相同
    // unless 中可设置不验证的 url
    app.use(
      koajwt({
        secret: SECURT_KEY
      }).unless({
        path: [/\/api\/user\/register/, /\/api\/user\/login/]
      })
    );
  5. 获取 token 中的内容

    js
    const jwt = require('jsonwebtoken');
    
    app.use((ctx, next) => {
      let token = ctx.header.authorization;
      if (token) {
        let payload = jwt.decode(token.split(' ')[1], 'IHS9794Nis');
        ctx.request.body.userId = payload.userId;
      }
      return next();
    });
关注微信公众号V.PS- 美国 CN2 GIA / 9929 / CMIN2 顶级线路
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0

预览:

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3