const http = require('http');//服务器
const url = require('url');//路由功能
const mongoose = require('mongoose');//数据库
const querystring =require('querystring'); //转换字符串为对象
//各种引入
const app = http.createServer();//创建服务器
mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => { console.log('数据库连接成功'); })
.catch(() => { console.log('连接失败'); })
//以上是链接数据库
const UserSchema = new mongoose.Schema({
name: {
type: String,
require: true,
minlength: 2,
maxlength: 20
},
age: {
type: Number,
min: 0,
max: 1000
},
password: String,
hobbies: [String]
})
//以上是创建集合规则
const User = mongoose.model('User', UserSchema);
//以上是创建集合
// mongoimport -d playground -c users --jsonArray ./data.json
//用于往数据库里导入数组类型的json文件
app.on('request', async (req, res) => {
const method = req.method;//获取请求方式
const { pathname,query } = url.parse(req.url,true);//获取请求路径
if (method == 'GET') {
if (pathname == '/list' ||pathname=='/') {//呈现列表页面
let users = await User.find();//找到数据库里的数据!!使用异步函数,确保可以拿到数据....因为查询是耗时操作,会转到异步路径中.
console.log(users);
let list1 = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<a href="/add">添加用户</a>
<table>
<tr>
<td>用户名</td>
<td>年龄</td>
<td>爱好</td>
<td>操作</td>
</tr>`;//把页面存储在变量中,之后用就好了....暴力
//上面是找数据列表以上的值
//中间是把数据库里的值传到html文件中去
users.forEach(item => { //item是值的每个对象
list1 += `
<tr>
<td>${item.name}</td>
<td>${item.age}</td>
<td>`;//佛了,由于``中无法进行想要的循环,所以在次进行拆分
item.hobbies.forEach(item=>{
list1+=`<span>${item}</span>`
})
list1 += `
</td>
<!-- <td>${item.password}</td> 这里是密码。后来加的,只为看下效果 -->
<td>
<a href="/remove?id=${item._id}">删除</a>
<a href="/change?id=${item._id}">修改</a>
</td>
</tr>
`;//利用${item.val}显示了数据库里的值
});
//中间是把数据库里的值传到html文件中去
//下面是复制列表以下的东西
list1 += `
</table>
</body>
</html>`;
res.end(list1);
}
else if(pathname=='/add'){
let add=`<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>添加用户</h1>
<form action="/add" method="post">
<label for="">密码</label>
<input type="text" name="password" id="" placeholder="请输入密码">
<label for="">名字</label>
<input type="text" name="name" id="" placeholder="请输入名字">
<label for="">年龄</label>
<input type="text" name="age" id="" placeholder="请输入年龄">
<label for="">选择爱好</label>
<input type="checkbox" value="aaa" name="hobbies">aaa
<input type="checkbox" value="123" name="hobbies">123
<input type="checkbox" value="dota" name="hobbies">dota
<input type="submit">
</form>
</body>
</html>`;
res.end(add);
}else if(pathname=='/change'){//先把add的方法拿过来(因为修改和添加差不多)
let user= await User.findOne({_id:query.id});//通过id获取到数据
console.log(user);
let hobbies=["aaa","123","dota"];
let change=`<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>修改用户</h1>
<form action="/change?id=${user._id}" method="post">
<label for="">密码</label>
<input value="${user.password}" type="text" name="password" id="" placeholder="请输入密码">
<label for="">名字</label>
<input value="${user.name}" type="text" name="name" id="" placeholder="请输入名字">
<label for="">年龄</label>
<input value="${user.age}" type="text" name="age" id="" placeholder="请输入年龄">
<label for="">选择爱好</label>`;
hobbies.forEach((item)=>{
let ishobby= user.hobbies.includes(item); //返回T o F
if(ishobby){//判断是否被选中
change+=`
<input type="checkbox" value="${item}" checked>${item}
`;
}else{
change+=`<input type="checkbox" value="${item}">${item}`;
}
})
change+=`
<input type="submit">
</form>
</body>
</html>`;//添加路由。呈递修改页面STEP-1
res.end(change);
}else if(pathname=='/remove'){
console.log(query.id);//先试下能否得到id
await User.findOneAndDelete({_id:query.id});//删除方法
res.writeHead(301,{
location:'/list'
});
res.end();
}
} else if (method == 'POST') {
if(pathname=='/add'){
console.log('123');//测试下能不能到这里
//1-接受提交信息
let formdata='';
req.on('data',(param)=>{ //多次data事件(有数据传输就会触发)
formdata+=param;
});
req.on('end',async ()=>{ //一次end事件
let user=querystring.parse(formdata);
console.log('成功添加数据+1\n',querystring.parse(formdata));//在控制台测试,打印结果(字符串属性转换为了对象属性)
//2-添加到数据库中
await User.create(user);
res.writeHead(301,{ //301代表重定向,location代表要跳转的地址
location:'/list'
});
res.end(); //这个很重要,代表结束
});
}else if(pathname=="/change"){//复制粘贴上面的先
console.log('123');//测试下能不能到这里
//1-接受提交信息
let formdata='';
req.on('data',(param)=>{ //多次data事件(有数据传输就会触发)
formdata+=param;
});
req.on('end',async ()=>{ //一次end事件
let user=querystring.parse(formdata);
console.log('成功修改数据+1\n',querystring.parse(formdata));//在控制台测试,打印结果(字符串属性转换为了对象属性)
//2-添加到数据库中
await User.updateOne({_id:query.id},user);//这里有改动,变为updateone属性
res.writeHead(301,{ //301代表重定向,location代表要跳转的地址
location:'/list'
});
res.end(); //这个很重要,代表结束
});
}
};
});
app.listen(3000);
console.log('SUCCESS\nhttp://localhost:3000/');
//对响应做出反应
//笔记:
//想要后台更新数据,在命令行输入以下命令(重新引入数据文件)并删除旧的就行了,很是**,以后肯定会有更好的方法
// mongoimport -d playground -c users --jsonArray ./data.json
//怎样在这个文件中设立跳转?简单,把helf='add.html'换成'/add'就好了!!!!
//在from下添加action:/add 才能当点submit时候才会做到if(post)中的(pathname==’/add‘)
// 案例反思和总结:
// 1-首先,字符串拼接这些操作无需多次记忆,之后在学习模板引擎以后会很快的掌握
// 2-之后的学习重点会转向VUE,毕竟项目开始催了<OK,开始正式写反思>
// 3- { useNewUrlParser: true, useUnifiedTopology: true } 的使用,看命令行提不提示
// 4- const { pathname,query } = url.parse(req.url,true); 这个方法多次使用,注意!
// 5- async 和 await 注意,出现有读取,载入等要等待的(异步进程)就可以用了
// 6-使用异步函数,确保可以拿到数据....因为查询是耗时操作,会转到异步路径中.
// 7-利用${item.val}显示了数据库里的值
// 8-以后多看看post和get方法
mongoDB Demo完整版
最新推荐文章于 2023-05-19 08:30:00 发布