NodeJs+MongoDB+Koa2 来实现完整版的登录功能

344 阅读2分钟

NodeJs+MongoDB+Koa2 来实现完整版的登录功能

1.初始化项目

脚手架创建 koa2, 安装 session 插件, 配置 cookie 和 session

使用脚手架, 创建 koa2 项目

windows+r cmd 打开命令行 切到桌面

用koa2在桌面创建一个项目 koa2 koa2-login

和每一次创建项目一样,打开nodejs 先运行npm i

这样,就安装好所依赖的包node_modules

下面启动服务npm run start,浏览器打开http://localhost:3000.

2.项目开始

安装包npm i koa-generic-session,导入ap.js,并进行配置

安装好以后在app.js中导入先在 app.js 中导入 koa-generic-session

const session = require("koa-generic-session");

然后在然后在 app.js 中进行 session 的一些配置

这一步app.js中新增的代码如下

app.keys = ["login-koa2-demdsagadgf#$^o"];

app.use(
	koaSession({
		cookie: {
			path: "/",
			httpOnly: true,
			maxAge: 24 * 60 * 60 * 1000,
		},
	})
);

打开 compass, 新建数据库(database)和集合(collection)

写两条测试数据进去

image.png

安装 mongoosenpm i mongoose 并配置

项目搞定之后, 新建db\index.js用来导入mongoose并配置

// 数据库设置

const mongoose = require("mongoose");
const url = "mongodb://localhost:27017";
const dbName = "login-demo";

// 开始连接

mongoose.connect(`${url}/${dbName}`);

const conn = mongoose.connection;

conn.on("error", (err) => console.log(err));

module.exports = mongoose;

可以使用 node 运行一下, 如果没有报错, 说明代码书写没有问题

创建数据模型, 定义数据格式 给 collection 绑定规则

所谓数据模型, 就是规范数据格式用的 **导出刚才配置好的mongoose

我们开始定义数据格式db\model.js**

// db\model.js
const mongoose = require("./index");

// 定义 Schema
const UserSchema = mongoose.Schema(
	{
		username: {
			type: String,
			required: true, // 必传
			unique: true, // 唯一, 去重
		},
		password: {
			type: String,
			required: true, // 必传
		},
		age: {
			type: Number,
			default: 0, 
		},
		city: {
			type: String,
			default: "", 
		},
		gender: {
			type: Number,
			default: 0, // 0-保密, 1 男, 2 女
		},
	},
	{
		timestamps: true, // 时间戳, 自动添加文档的创建时间
		versionKey: false, // 关闭版本信息
	}
);
// db\model.js
// 定义Model, 第一个参数, 对应collection的单数,比如collection是users, 第一个参数就是user, 第二个是对应的规则
const User = mongoose.model("user", UserSchema);

module.exports = {
	User,
};


登录功能对接数据库

定义路由 编写路由基础测试代码

这一步在路由文件夹下新增的代码如下

router.post("/login", async (ctx, next) => {
	ctx.body = "这是登录接口";
});

router.post("/register", async (ctx, next) => {
	ctx.body = "这是注册接口";
});

开启服务,npm run dev(没有的话,安装或者看一下pask.json里面用什么开启服务,一般都有npm run start)

开启服务以后使用api测试接口

image.png

api测试可以以后,# 完善登录路由

路由下面的user.js里面完整代码如下

const { User } = require("../db/model");

const router = require("koa-router")();

router.prefix("/users");

router.get("/", function (ctx, next) {
  ctx.body = "this is a users response!";
});

router.get("/bar", function (ctx, next) {
  ctx.body = "this is a users/bar response";
});
//登录接口
// 走login,就是登录接口
router.post("/login", async (ctx, next) => {
  // 先从请求体里面获取一个username和password
  const { username, password } = ctx.request.body;
  // 判断用户名自和密码是否存在
  if (!username) {
    ctx.body = {
      errno: 1,
      message: "用户名不能为空!",
    };
    return;
  }
  if (!password) {
    ctx.body = {
      errno: 2,
      message: "密码不能为空!",
    };
    return;
  }
  // 到这一步说明存在,就去查数据库,(第一步已经定义了数据和数据库的规则)
  const result = await User.findOne({ username, password }, { password: 0 });
  // 结果为空
  if (result == null) {
    ctx.body = {
      errno: 3,
      message: "用户名或密码不正确",
    };
    return;
  }
  // 如果result不为空,把session保存到result
  ctx.session.userInfo = result;
  ctx.body = {
    errno: 3,
    message: "登录成功",
    data: result,
  };
});
// 注册接口
router.post("/register", async (ctx, next) => {
  ctx.body = "这是注册接口";
});
module.exports = router;