AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
1.1为什么要使用数据库 ~~~ ●动态网站中的数据都是存储在数据库中的 ●数据库可以用来持久存储客户端通过表单收集的用户信息 ●数据库软件本身可以对数据进行高效的管理 ~~~ ~~~ http://www.czxy.com/article?id=1 http://www.czxy.com/article?id=2 ~~~ 1.2什么是数据库 数据库即存储数据的仓库,可以将数据进行有序的分门别类的存储。它是独立于语言之外的软件,可以通过API去操作它。 ●常见的数据库软件有: mysql、 mongoDB、 oracle. ![](https://img.kancloud.cn/5c/2d/5c2d2997505a2c5e43c34115bc123e88_1341x337.png) 1.3 MongoDB数据库下载安装 下载地址:[https://www.mongodb.com/download-center/community](https://www.mongodb.com/download-center/community) 下载数据库和工具 On-premises>MongoDB Community Server Tool>MongoDB Compass 1.4 MongoDB可视化软件 MongoDB可视化操作软件,是使用图形界面操作数据库的一种方式。 ![](https://img.kancloud.cn/ee/2e/ee2e3cf2ee6b800ef48e4424d23bfbd0_800x507.png) 1.5数据库相关概念 在一个数据库软件中可以包含多个数据仓库,在每个数据仓库中可以包含多个数据集合,每个 数据集合中可以包含多条文档(具体的数据)。 | 术语 | 解释说明 | | --- | --- | | database | 数据库,mongoDB数据库软件中可以建立多个数据库 | | collection | 集合,一组数据的集合,可以理解为JavaScript中的数组 | | document | 文档,一条具体的数据,可以理解为JavaScript中的对象 | | field | 字段,文档中的属性名称,可以理解为JavaScript中的对象属性 | 1.6 Mongoose第3三方包 npm install mongoose ●使用Node.js操作MongoDB数据库 需要依赖Node.js第三方包mongoose ●使用npm install mongoose命令下载 在当先项目下创建一个数据库文件夹(用于mongoose连接数据库) 1.7启动MongoDB 在命令行工具中运行`net start mongoDB`即可启动MongoDB,否则MongoDB将无法连接。 `net stop mongodb`停止运行 1.8数据库连接 使用mongoose提供的connect方法即可连接数据库。 ~~~ mongoose.connect ( ' mongodb:// localhost/playground' ) .then(() => console.log ('数据库连接成功')) .catch(err => console.log('数据库连接失败',err)) ; ~~~ 连接前 要在当前项目下载mongoose工具 帮忙连接数据库 ![](https://img.kancloud.cn/cc/b0/ccb07f05b4f13857c3cbe19061f0d336_1459x670.png) 1.9创建数据库 在MongoDB中不需要显式创建数据库,如果正在使用的数据库不存在,MongoDB会自动创建。 3.MongoDB增删改查操作 3.1创建集合 (引用的ngoose模块使用里面的各种方法 其中有一个创建数据表的方法 ) 创建集合分为两步, 一是对对集合设定规则,二是创建集合,创建mongoose.Schema构造函数的实例即可创建集合。 ~~~ mongoose.Schema(构造函数 规则) mongoose.model (根据构造函数 规则 创建数据表) ~~~ ~~~ /设定集合规则 const courseSchema = new mongoose.Schema ( { name: String, author: String , isPublished: Boolean }) ; //创建集合并应用规则 (Course 数据库表名) const Course = mongoose.model ('Course',courseSchema) ; / courses ~~~ 3.2创建文档 (插入数据) 创建文档实际上就是向集合中插入数据。 分为两步: ①创建集合实例。 ②调用实例对象下的save方法将数据保存到数据库中。 ~~~ //创建集合实例 const course = new Course ({ name: 'Node.js coulFse' , author: ' 黑马讲师' , tags: ['node' ,'backend'] , isPublished: true }) ; //将数据保存到数据库中 course.save () ; ~~~ 2.0 插入文档 数据库插入数据 ~~~ Course.create ({name: ' JavaScript基础',author: ' 黑马讲师',isPublish: true}, (err, doc) => { //错误对象 console.log (err) //当前插入的文档 console.log (doc) }) ; ~~~ ~~~ Course.create ({name: ' JavaScript基础',author: , 黑马讲师',isPublish: true}) then(doc => console. log (doc) ) catch(err => console.log (err) ) ~~~ 3.3 mongoDB数据库导入数据 mongoimport -d数据库名称-c集合名称-file 要导入的数据文件 找到mongodb数据库的安装目录,将安装目录下的bin目录放置在环境变量中。 配置环境变量 ![](https://img.kancloud.cn/39/8f/398f38dd93b55908f04579024ff49bb1_1192x503.png) ## 3.4查询文档 //根据条件查找文档(条件为空则查找所有文档) ### 查询所有数据 ~~~ Course.find().then (result => console.log (result) ) ~~~ 上面代码执行后的结果 ~~~ //返回文档集合 [{ id: 5c0917ed37ec9b03c07cf95f , name: 'node.js基础' , author: 1 黑马讲师、 },{ _id: 5c09dea28acfb814980ff827 , name: ' Javascript ' author: ' 黑马讲师、 }] ~~~ ### 通过\_id字段查找 ~~~ User.find({_ id: ' 5c09f267aeb04b22f8460968 }).then(result => console . log(result)) ~~~ ### 根据条件查找对象 findone ~~~ findOne() 没传参数方法返回一条文档默认返回当前集合中的第一 条文档 then (返回正确的) 传了参数 Course.findone ({name: ' node. js基础' }).then(result => console.log (result) ) ~~~ ### //查询用户集合中年龄字段大于20并且小于40的文档 (匹配大于$gt 小于$lt) ~~~ 查询用户集合中年龄字段大于20并且小于40的文档 age(属性 对象) User. find({age: {$gt: 20,$lt:50}}) .then (result => console. log (result) ) ~~~ ### //匹配包含 $in 重点 常用 ~~~ hobbies(属性 对象) User. find({hobbies: $in: ['敲代码']}}) . then(result => console. log (result)) ~~~ ### //选择要查询的字段 select (不想查询某个字段 前面加 - ) ~~~ User. find().select('name email') . then (result => console. log (result) ) ~~~ ### //将数据按照年龄进行排序 sort ~~~ 升序 User.find().sort('age').then(result => console. log (result) ) //根据年龄字段进行降序排列 前面加- User.find().sort('-age' ).then(result => console . log(result)) ~~~ // skip 跳过(前面)多少条数据 limit 限制查询数量(搜出来的结果) ~~~ User.find().skip(2).limit(2).then(result => console. log (result) ) ~~~ ## 3.5删除文档 ~~~ //删除单个 findoneAndDelete({}) Course.findoneAndDelete({}) . then (result => console. log (result) ) ~~~ ![](https://img.kancloud.cn/64/1e/641ea5e3a6a845de3946d8d9829d8f28_1536x98.png) ~~~ //删除多条文档 User . deleteMany({}) . then (result => console. log (result) ) ~~~ ## 3.6更新文档 (修改数据) //更新单个 修改一个数据 ~~~ User.updateOne ({查询条件},{要修改的值}).then(result => console.log (result)) User.update0ne( {name: '李四'}, {name: ' 李狗蛋'}).then(result => console.log (result)) ~~~ /更新多个 修改多个数据 ~~~ User.updateMany ({查询条件},{要更改的值}) . then (result => console.log (result)) //更新集合中的文档(更新多个) User.updateMany({}, {age: 56}).then(result => console.log(result)) ~~~ # 3.6 mongoose验证 在创建集合规则时,可以设置当前字段的验证规则,验证失败就则输入插入失败。 ~~~ ●required: true必传字段 ●minlength: 3字符串最小长度 字符串 ●maxlength: 20字符串最大长度 字符串 ●min: 2数值最小为2 数字 ●max: 100数值最大为100 数字 type: Date, //时间 default: Date.now //默认值 输入现在时间 enum选举 //判断输入的类型满不满足enum的要求,不满足,返回错误 ●trim: true去除字符串两边的空格 ●validate: 自定义验证器 ●enum: ['html', 'Css', javascript', 'node.js'] //自定义错误信息 message ~~~ ~~~ const postSchema = new mongoose . Schema({ title: { type: String, y// 必选字段 required: [true, '请传入文章标题'], //字符串的最小长度 minlength: [2, '文章长度不能小于2'], //字符串的最大长度 maxlength: [5, '文章长度最大不能超过5'], //去除字符串两边的空格 trim: true }, age:{ type: Number, min:18, max: 100}, publishDate: { //时间 type: Date, //默认值 default: Date.now }, category: { type: String, //修 enum选举 判断输入的类型满不满足enum的要求,不满足,返回错误 //枚举列举出当前字段可以拥有的值 enum :{ values: [ ' html' , 'css' ,' javascript',' node.js'], message:'分类名称要在一定的范围内才可以" } }, validate: { validator: V => { //返回布尔值 // true验证成功 // false 验证失败 // v要验证的值 return V && v.length > 4 //&&并且 }, //自定义错误信息 message:'传入的值不符合验证规则' } }); ~~~ ~~~ Post. create( {title:' aa”,age: 60, category: 'html', author: 'bd'}) .then(result => console.log( result) ) // 原 下面为优化版.catch(error => console.log(error) ) catch(error => { //获取错误信息对象 const err = error. errors ; //循环错误信息对象 for (var attr in err) { //将错误信息打印到控制台中 console. log(err[attr][' message '] ) ; ~~~ .then(result => console.log( result) ) 获取代码执行后返回信息 then 输出正确的 .catch(error => console.log(error) ) 获取代码执行后返回信息 catch 错误的 3.7集合关联 populate 通常**不同集合的数据之间是有关系的**,例如文章信息和用户信息存储在不同集合中,但文章是某个用户发表的,要查询文章的所有信息包括发表用户,就需要用到集合关联。 ~~~ ●使用id对集合进行关联 ●使用populate方法进行关联集合查询 ~~~ ![](https://img.kancloud.cn/68/79/687957160a4d08f841ab8430f91ce04d_676x345.png) 3.7集合关联实现 ref(关联) ~~~ //用户集合 const User = mongoose.model ('User',new mongoose.Schema({ name: { type : String } })) ; //文章集合 const Post = mongoose.model('Post', new mongoose.Schema ({ title: { type: String } , //使用ID将文章集合和作者集合进行关联 author: { type: mongoose.Schema.Types.objectId, ref: 'User' } })) ; //联合查询 Post.find() .populate(' author' ) //查询具体的某个结果 .then((err, result) => console. log (result)) ; ~~~ ![](https://img.kancloud.cn/44/b3/44b311dd76c753542dba33e577c8e2ac_1540x723.png) # 3.8案例:用户信息增删改查 需求 ![](https://img.kancloud.cn/7f/a0/7fa0449d6083bb8a45a6dd3ccb2dddf3_1367x390.png) 添加修改页面 ![](https://img.kancloud.cn/99/b9/99b98bf9d3f9e0775d85efb995cd9be8_922x535.png) ## 步骤 1.搭建网站服务器,实现客户端与服务器端的通信 2.连接数据库, 创建用户集合,向集合中插入文档 3.当用户访问/list时, 将所有用户信息查询出来 4.将用户信息和表格HTML进行拼接并将拼接结果响应回客户端 5.当用户访问/add时, 呈现表单页面,并实现添加用户信息功能 6.当用户访问/modify时, 呈现修改页面,并实现修改用户信息功能 7.当用户访问/delete时, 实现用户删除功能 ### 1.搭建网站服务器,实现客户端与服务器端的通信 ~~~ const http = require( 'http' ); //创建服务器 const app = http. createServer(); //为服务器对象添加请求事件 app.on( ' request ', (req, res) => { res .end( 'ok') }) //监听端口 app.listen( 3000) ; ~~~ ### 2.连接数据库, 创建用户集合,向集合中插入文档 在当前项目下下载mongoose 模块`npm install mongoose` ~~~ const mongoose =require( ' mongoose' ) ; //数据库连接27017是mongodb数据库的默认端口 mongoose.connect( ' mongodb:/ / localhost/playground', { useNewUrlParser: true }) then(() => console.log( '数据库连接成功')) catch(() => console.log( '数据库连接失败')); //创建用户集合规则 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) ; ~~~ ### 3.当用户访问/list时,将所有用户信息查询出来 地址栏请求 在get 下操作 实现路由功能 呈现用户列表页面 从数据库中查询用户信息将用户信息展示在列表中 ${[item.name](http://item.name/)} 写入数据库信息同步页面 ~~~ 引入模块功能 const url = require( 'url') 在服务器响应哪里添加 //为服务器对象添加请求事件 app.on( ' request ',async (req, res) => { //请求方式 const method = req.method; //请求地址 const { pathname } = Iurl.parse(req. url); if (method=='GET') { //呈现用户列表页面 在页面复制静态面 放在下面动态输出数据 if ( pathname =='/list') { //查询数据 Let users= await User.find( ); console.log(users ) //html字符串 //静态页面复制在里面 Let list=' '; //对数据进行循环操作 users.forEach(item => { list +=’ <tr> <td>${ item.name}</td> <td>$ { item.age}</td> <td> <span>抽烟</ span> < span>喝酒< / span> < span>烫头</ span> </td> <td>${ item.email}</td> </tr> ; }) list +=' </ table> </div> </body> '; 返回数据在页面 res.end(list); } }else if (method=='POST') { } } ~~~ ![](https://img.kancloud.cn/ca/64/ca6488758eaf7e87b402f85fb88fd1ec_1065x767.png) 5.当用户访问/add时, 呈现表单页面,并实现添加用户信息功能 // 301代表重定向 // location 跳转地址 res.writeHead(301, { Location:' / list ' }); ~~~ 引入 将字符串转换对象格式 const querystring = require( ' querystring ') //为服务器对象添加请求事件 app.on( ' request ',async (req, res) => { //请求方式 const method = req.method; //请求地址 const { pathname } = Iurl.parse(req. url); if (method=='GET') { if ( pathname =='/list') { }else if (pathname == ' /add') { Let add =res.end( add) } }else if (method == ' 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(); ~~~ ### 6.当用户访问/modify时, 呈现修改页面,并实现修改用户信息功能 1.增加页面路由呈现页面 1.1.在点击修改按钮的时候将用户ID传递到当前页面 1.2.从数据库中查询当前用户信息将用户信息展示到页面中 ![](https://img.kancloud.cn/3a/c1/3ac169536fd3942d9f4d8edb9e1a0422_1354x829.png) ![](https://img.kancloud.cn/4b/bd/4bbd82ab995348b61bbf3ab87165c09c_1056x547.png) ![](https://img.kancloud.cn/68/48/684833293fca88cb84188b22944fd73b_1129x749.png) 2.实现用户修改功能 1.指定表单的提交地址以及请求方式 2.接受客户端传递过来的修改信息找到用户将用户信息更改为最新的 ![](https://img.kancloud.cn/89/7e/897e15bf4daea5a5835ea6d75f2abb62_1157x774.png) 7.当用户访问/delete时, 实现用户删除功能 ![](https://img.kancloud.cn/03/02/03021d65e4466332ef85f8e1567c004c_1209x763.png)