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)
写两条测试数据进去
安装 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测试接口
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;