美文网首页
Koa mongoose 学习笔记

Koa mongoose 学习笔记

作者: liuxinya | 来源:发表于2019-05-06 18:42 被阅读0次

中间件

@Koa/cors

  • 前后端分离 所以用了 @koa/cors 来解决跨域
  app.use(cors({
       origin(ctx) {
            const origin = ctx.accept.headers.origin;
            return origin;
        },
        credentials: true,
        allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS',
  }));

koa-session

  • 用来生成session信息,塞到header里面

koa-body

  • 用来解析前端请求的数据类型

koa-bodyparser

  • 用来解析前端的请求数据类型
  app.use(bodyParser({
        jsonLimit: '10mb'    // 增大数据的大小限制(图片的存储) 默认1M 超过限制报413错误
  }))

koa-static

  • 用来解析静态资源
app.use(require('koa-static')(path.join(__dirname, '..', "public")));

koa-router

错误拦截

// 中间件捕捉不到的错误 这里可以拦截
process.on('uncaughtException', err => {
    console.error('app uncaughtException', err.stack);
});

process.on('unhandledRejection', (reason, p) => {
    console.error('app Unhandled Rejection at:', p, 'reason:', reason);
});

mongoose

  1. 初始化

const mongoose = require('mongoose');
const db = mongoose.connection;
function initMongoose() {
    mongoose.connect('mongodb://127.0.0.1:27017/myblog');
    db.on('error', console.error.bind(console, 'connection error:'));
    db.once('open', function() {
        console.log('链接数据库成功!');
    });
}
module.exports = initMongoose;

  1. 创建一个model
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
let UserSchema = new Schema({
    username: String,
    age: {
        type: Number,
        default: 18
    },
    password: String,
    token: String
});
UserSchema.statics.findUser = async function(options) {
    return await this.findOne(options, {
        password : 0 // 返回结果不包含密码字段
    });
}
UserSchema.statics.addUser = async function(info, cb) {
    let User = this;
    new User(info).save(cb);
}
UserSchema.statics.updateUser = async function(option, tarValue) {
    // this.where(option)
    //     .update(tarValue, cb)
    await this.updateOne(option, tarValue);
}
const User = mongoose.model('User', UserSchema);
module.exports = User;
  1. 数据的存取
const User = require('../model/user');
const encrypt = require('../help/encrypt');
const token = require('../help/token');
const register = async (ctx, next) => {
    try {
        let userInfo = ctx.request.body;
        let newPas = encrypt(userInfo.password)   // 密码加密处理
        let newInfo = {
            password: newPas,
            username: userInfo.username,
        }
        let user = await User.findUser({username: userInfo.username});
        if(user) {
            ctx.fail(false,'用户名被注册!')
        }else {
            User.addUser({
                ...newInfo,
                token: token.createToken(userInfo.username)
            });
            ctx.success(true, '注册成功!')
        }
    }catch(e) {
        ctx.fail();
    }
}
module.exports = register;

密码加密

  • crypto 模块 (yarn add crypto)
const crypto = require('crypto');

function encrypt(options) {
    let md5 = crypto.createHash("md5");
    return  md5.update(options).digest("hex");

}
module.exports = encrypt;

token

生成token

  • yarn add jsonwebtoken
function createToken(user_name){
    // 创建token时,我们把用户名作为JWT Payload的一个属性,并且把密钥设置为liuxinya,token过期时间设置为60s。意思是登录之后,60s内刷新页面不需要再重新登录。
    const token = jwt.sign({user_name: user_name}, 'liuxinya', {expiresIn: '3600s'});
    // console.log(token)
    return token;
};

验证token

jwt.verify(token, 'liuxinya');//如果token过期或验证失败,将抛出错误

从token里面拿到用户信息

function getUserNameFromToken(ctx) {
    const token = ctx.cookies.get("userId");
    return jwt.decode(token).user_name;
}

验证用户权限

  • 用户登录成功之后, node端会生成一个token并塞到cookie里面去
  • token里面含有用户信息还有一段标志token有效性的时间戳
  • 前端每次请求会携带此token
  • 后端通过验证token的有效性决定是否允许前端请求相应的资源

模块


遇到的问题

前端每次请求不自动携带cookie, 后端设置不上cookie

  • 前端 axios 默认不携cookie 需要设置
axios.defaults.withCredentials = true;
  • 后端在初始化也要有相应的配置
const cors = require('@koa/cors');
app.use(cors({
      origin(ctx) {
          const origin = ctx.accept.headers.origin;
          return origin;   // 生产环境要做白名单限制,符合条件的origin才返回
      },
      credentials: true,
      allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS',
 }));

项目地址: https://github.com/liuxinya/node-koa-mongoose develop分支

相关文章

  • Koa mongoose 学习笔记

    中间件 @Koa/cors 前后端分离 所以用了 @koa/cors 来解决跨域 koa-session 用来生成...

  • koa mongoose查询

    一、分页查询+查询所有 二、添加数据到数据库 注:new Article为创建对应的数据模型 三、删除数据 四、修改数据

  • Node 第三课

    mongoose 笔记 连接字符串mongoose.connect(DB_URL); 链接成功mongoose.c...

  • mongoose 学习笔记

    一、介绍 1. 概述 mongoose 模块用于简化 node 与数据库 mongodb 之间的操作,目的是通过简...

  • mongoose学习笔记

    首先是基础crud操作 查询简单查询条件查询 插入 更新 查询 简单查询 mongoose: 条件查询 (>) 大...

  • Mongoose学习笔记

    Mongoose介绍 一、mongoose 介绍 Mongoose是在node.js异步环境下对mongodb进行...

  • mongoose学习笔记

    快速上手 前提 安装 MongoDB 和 Node.js 本次学习的 mongoose 版本是 5.4 Mongo...

  • mongoose 学习笔记

    1. 安装mongoose 2.创建mongoose连接 在model文件夹中,创建db.js文件用于创建数据库的...

  • koa如何连接MongoDB

    这个方法,node,express,koa连接MongoDB都是一样的方法,我们利用mongoose模块来连接 注...

  • mongoose schema Schema hasn't be

    我想在学习mongoose/koa的路上无数个小伙伴都会踩的坑,然后再网上疯狂的寻找解决这个坑的办法,然后网上那些...

网友评论

      本文标题:Koa mongoose 学习笔记

      本文链接:https://www.haomeiwen.com/subject/jmatmqtx.html