想要获取源代码的同学可以留言,我不做git上传了,案例太简单 没必要
综合演练 用户信息的增删改查
需求:你需要实现这样的结果
点击添加可以添加用户,点击删除可以删除点击修改可以修改
代码分析:
1.搭建网站服务器,实现客户端与服务器端的通信
2.连接数据库,创建用户集合,向集合中插入文档
3.当用户访问/list时,将所有用户信息查询出来
4.将用户信息和表格HTML进行拼接并将拼接结果响应回客户端
5.当用户访问/add时,呈现表单页面,并实现添加用户信息功能
6.当用户访问/modify时,呈现修改页面,并实现修改用户信息功能
7.当用户访问/delete时,实现用户删除功能
搭建文件夹结构
- 搭建服务器,建立起通信
const url = require('url');
const querystring = require('querystring');
const http = require('http')
const app = http.createServer();
app.on('request', (req, res) => {
res.end('ok')
})
app.listen(3000)
- 链接数据库
// 1.先创建
const mongoose = require('mongoose');
// 数据库连接 27017是mongodb数据库的默认端口
mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true })
.then(() => console.log('数据库连接成功'))
.catch(() => console.log('数据库连接失败'));
// 2. 创建用户集合规则,定义验证
const userSchema = new mongoose.Schema({
name: {
type: String,
required: true,
minlength: 2,
maxlength: 20
},
age: {
type: Number,
min: 18,
max: 80
},
password: String,
email: String,
hobbies: [String]
});
// 创建集合 返回集合构造函数,并且拿到最重要的的东西----集合构造函数
const User = mongoose.model('User', userSchema);
//别忘记了我们导入一些文件在user.json中
// 命令行操作也许gui操作也可以,你喜欢就好
- 实现路由,把数据拿出来渲染出来
代码比较多,但是它的业务逻辑是非常简单的
//这个里面的async
app.on('request', async(req, res) => {
const method = req.method;
const { pathname, query } = url.parse(req.url, true);
//注意整理的${item._id}都是获取浏览器请求的字符串解析
if (method == 'GET') { //注意这里的get方式
// 呈现用户列表页面-数据是一点一点的拼接
if (pathname == '/list') {
// 查询用户信息
let users = await User.find(); //返回的是一个数据库数组
// html字符串
let list = `
用户列表
添加用户
用户名
年龄
爱好
邮箱
操作
`;
// 对数据进行循环操作
users.forEach(item => { //注意这个东西 item是一个一个数组对象,它是从 users finde从数据库找来的
list += `
${item.name}
${item.age}
`;
//这个比较特殊,爱好是数组中的数组,所有我们需要多层的循环
item.hobbies.forEach(item => {
list += `${item}`;
})
list += `
${item.email}
删除
修改
`;
});
list += `
`;
res.end(list);
} else if (pathname == '/add') {
// 呈现添加用户表单页面
let add = `
用户列表
添加用户
`;
res.end(add)
//
} else if (pathname == '/modify') {
let user = await User.findOne({ _id: query.id }); //通过id拿到数据
let hobbies = ['足球', '篮球', '橄榄球', '敲代码', '抽烟', '喝酒', '烫头', '吃饭', '睡觉', '打豆豆']
console.log(user)
// 呈现修改用户表单页面
let modify = `
用户列表
修改用户
`;
res.end(modify)
} else if (pathname == '/remove') {
// res.end(query.id)
await User.findOneAndDelete({ _id: query.id });
res.writeHead(301, {
Location: '/list'
});
res.end();
}
//另外一个post路由
} else if (method == 'POST') { //这里是的是post方式
// 用户添加功能
if (pathname == '/add') {
// 接受用户提交的信息
let formData = '';
// 接受post参数是一步一步的接收的,
req.on('data', param => {
formData += param;
})
// post参数接受完毕
req.on('end', async() => {
let user = querystring.parse(formData) //解析格式
// 将用户提交的信息添加到数据库中
await User.create(user);
// 301代表重定向
// location 跳转地址
res.writeHead(301, {
Location: '/list'
});
res.end();
})
} else if (pathname == '/modify') {
// 接受用户提交的信息
let formData = '';
// 接受post参数
req.on('data', param => {
formData += param;
})
// post参数接受完毕
req.on('end', async() => {
let user = querystring.parse(formData)
// 将用户提交的信息添加到数据库中
await User.updateOne({ _id: query.id }, user);
// 301代表重定向
// location 跳转地址
res.writeHead(301, {
Location: '/list'
});
res.end();
})
}
}
});
- 把模块分离出来
下面是uers.js的代码,完成创建
//从app.js抽取中出来
const mongoose = require('mongoose');
// 创建用户集合规则
const userSchema = new mongoose.Schema({
name: {
type: String,
required: true,
minlength: 2,
maxlength: 20
},
age: {
type: Number,
min: 18,
max: 80
},
password: String,
email: String,
hobbies: [String]
});
// 创建集合 返回集合构造函数
const User = mongoose.model('User', userSchema);
//之前讲node基础的时候就讲过:开放某一部分的参数,这个参数可以是函数
module.exports = User;//把东西开放出去
下面的是index.js代码,完成数据库连接
//从app.js抽取中出来
const mongoose = require('mongoose');
// 数据库连接 27017是mongodb数据库的默认端口
mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true })
.then(() => console.log('数据库连接成功'))
.catch(() => console.log('数据库连接失败'));
下面的是app.js
// 搭建网站服务器,实现客户端与服务器端的通信
// 连接数据库,创建用户集合,向集合中插入文档
// 当用户访问/list时,将所有用户信息查询出来
// 实现路由功能
// 呈现用户列表页面
// 从数据库中查询用户信息 将用户信息展示在列表中
// 将用户信息和表格HTML进行拼接并将拼接结果响应回客户端
// 当用户访问/add时,呈现表单页面,并实现添加用户信息功能
// 当用户访问/modify时,呈现修改页面,并实现修改用户信息功能
// 修改用户信息分为两大步骤
// 1.增加页面路由 呈现页面
// 1.在点击修改按钮的时候 将用户ID传递到当前页面
// 2.从数据库中查询当前用户信息 将用户信息展示到页面中
// 2.实现用户修改功能
// 1.指定表单的提交地址以及请求方式
// 2.接受客户端传递过来的修改信息 找到用户 将用户信息更改为最新的
// 当用户访问/delete时,实现用户删除功能
const http = require('http');
const url = require('url');
const querystring = require('querystring');
//重新引入抽离出去的代码
require('./model/index.js');
const User = require('./model/user');
// 创建服务器
const app = http.createServer();
// 为服务器对象添加请求事件
app.on('request', async(req, res) => {
// 请求方式
const method = req.method;
// 请求地址,query是保存了一些get和post属性,后面的true是把它变成一个对象
const { pathname, query } = url.parse(req.url, true);
//注意整理的${item._id}都是获取浏览器请求的字符串解析
if (method == 'GET') { //注意这里的get方式
// 呈现用户列表页面-数据是一点一点的拼接
if (pathname == '/list') {
// 查询用户信息
let users = await User.find(); //返回的是一个数据库数组
// html字符串
let list = `
用户列表
添加用户
用户名
年龄
爱好
邮箱
操作
`;
// 对数据进行循环操作
users.forEach(item => { //注意这个东西 item是一个一个数组对象,它是从 users finde从数据库找来的
list += `
${item.name}
${item.age}
`;
//这个比较特殊,爱好是数组中的数组,所有我们需要多层的循环
item.hobbies.forEach(item => {
list += `${item}`;
})
list += `
${item.email}
删除
修改
`;
});
list += `
`;
res.end(list);
} else if (pathname == '/add') {
// 呈现添加用户表单页面
let add = `
用户列表
添加用户
`;
res.end(add)
//
} else if (pathname == '/modify') {
let user = await User.findOne({ _id: query.id }); //通过id拿到数据
let hobbies = ['足球', '篮球', '橄榄球', '敲代码', '抽烟', '喝酒', '烫头', '吃饭', '睡觉', '打豆豆']
console.log(user)
// 呈现修改用户表单页面
let modify = `
用户列表
修改用户
`;
res.end(modify)
} else if (pathname == '/remove') {
// res.end(query.id)
await User.findOneAndDelete({ _id: query.id });
res.writeHead(301, {
Location: '/list'
});
res.end();
}
//另外一个post路由
} else if (method == 'POST') { //这里是的是post方式
// 用户添加功能
if (pathname == '/add') {
// 接受用户提交的信息
let formData = '';
// 接受post参数是一步一步的接收的,
req.on('data', param => {
formData += param;
})
// post参数接受完毕
req.on('end', async() => {
let user = querystring.parse(formData) //解析格式
// 将用户提交的信息添加到数据库中
await User.create(user);
// 301代表重定向
// location 跳转地址
res.writeHead(301, {
Location: '/list'
});
res.end();
})
} else if (pathname == '/modify') {
// 接受用户提交的信息
let formData = '';
// 接受post参数
req.on('data', param => {
formData += param;
})
// post参数接受完毕
req.on('end', async() => {
let user = querystring.parse(formData)
// 将用户提交的信息添加到数据库中
await User.updateOne({ _id: query.id }, user);
// 301代表重定向
// location 跳转地址
res.writeHead(301, {
Location: '/list'
});
res.end();
})
}
}
});
// 监听端口
app.listen(3000);