本实例旨在演示node+koa2+mongodb一个简单的效果:
1 用户注册,(支持上传头像),保存用户信息至服务器(mongodb)
2 用户登录,如果用户输入密码和服务器加密后的密码一致,则返给客户端用户信息,否则返给客户端json,提示用户名或密码不正确
目录结构如下
koa(根目录)
--------node_modules
-------static //存放静态资源的目录
----------upload //上传头像的目录
-----------regist.html //注册页面
------------login.html //登录页面
------login.js //登录逻辑的服务器文件
------regist.js //注册逻辑的服务器文件
--------dataBase.js //处理数据库的文件
--------------------------------------------------------------------------------------------------------------------------
1存放在静态资源文件夹static下的两个页面
regist.html
<form action="http://localhost:9999/addInfo" method="POST" enctype="multipart/form-data">
<p>姓名<input type="text" name="username" value=""></p>
<p>性别<input type="radio" name="gender" value="male"/>男<input type="radio" name="gender" value="female"/>女</p>
<p>密码<input type="password" name="password"></p>
<p><input type="file" name="file"></p>
<p><input type="submit"></p>
</form>
login.html
<form action="http://localhost:8989/login" method="POST" enctype="application/x-www-form-urlencoded">
<p><input type="text" name="username"></p>
<p><input type="password" name="password"></p>
<p><input type="submit" value="提交"></p>
</form>
2 位于根目录下的两个服务器文件regist.js、login.js
regist.js
var koa=require("koa");
var fs=require("fs");
var path=require("path")
var koaBody=require("koa-body");
var koaStatic=require("koa-static")
var router=require("koa-router")();
const baseUrl="http://localhost:9999";
var crypto=require("crypto");
//引入数据库配置文件
const dataBase=require('./dataBase.js');
var app=new koa();
//配置中间件
app.use(koaBody({
multipart:true,
formidable:{
uploadDir:path.join(__dirname,"static/upload"),
keepExtensions:true
}
}))
app.use(koaStatic(__dirname+"/static"));
app.use(router.routes())
app.use(router.allowedMethods());
//配置路由
router.get("/",async(ctx)=>{
let stream=fs.createReadStream("./static/submit.html");
ctx.type="html";
ctx.body=stream
})
router.post("/addInfo",async(ctx)=>{
let {username,password,gender}=ctx.request.body;
if(ctx.request.method!="get"){
let file=ctx.request.files.file;
let filePath=file.path;
let index=filePath.lastIndexOf("\\");
//写入数据到数据库,加密密码;
let md5=crypto.createHash("md5");
let newpass= md5.update(password).digest("hex");
let data={
username,
password:newpass,
gender,
url:baseUrl+`/upload/${filePath.substring(index+1)}`
}
let res= await dataBase.add(data);
//返回数据给客户端
ctx.body=data
}
})
app.listen(9999)
login.js
var fs=require("fs");
var koaBody=require("koa-body");
var koa=require("koa");
var router=require("koa-router")();
var crypto=require("crypto");
var dataBase=require("./dataBase.js");
var app=new koa();
app.use(koaBody());
app.use(router.routes());
app.use(router.allowedMethods());
router.get("/",async (ctx)=>{
ctx.type="html";
ctx.body=fs.createReadStream("./static/login.html");
})
router.post("/login",async (ctx)=>{
let {username,password}=ctx.request.body;
let md5=crypto.createHash("md5");
md5.update(password);
let passres=md5.digest("hex");
let newpass=passres
let resData=await dataBase.findOneUser({username:username});
if(resData.password==newpass){
ctx.body={
result:true,
data:{
username
}
}
}else{
ctx.body={
result:false,
data:{},
errInfo:"用户名或密码错误"
}
}
})
app.listen(8989)
最后一个配置服务器的baseData.js文件
baseData.js
var mongoose=require("mongoose");
const dbURL="mongodb://localhost:27017/user";
mongoose.connect(dbURL)
mongoose.connection.on("connected",()=>{console.log("连上"+dbURL)})
mongoose.connection.on("error",()=>{console.log("连结失败"+err)})
var schema=new mongoose.Schema({username:String,password:String,gender:String,url:String})
var userData=mongoose.model("userData",schema);;
class dataBaseHandle{
constructor(){
}
//添加
async add(data){
try{
return await userData.create(data)
}catch(err){
throw new Error(err)
}
}
async findOneUser(data){
try {
return await userData.findOne(data)
} catch (error) {
throw new Error(err)
}
}
}
module.exports=new dataBaseHandle