Node.js 和数据库

65 阅读5分钟

node.js

一、概念

是一门语法和JavaScript非常相似,和数据库做交互的后端语言

二、模块的分类

1.官方模块 - 不需要下载,但是有需要引入,有的不用引入

(1)Global - 全局模块,不需要引入,提供了一些东西


    1、__filename - 获取当前文件的完整的绝对路径
    2、__dirname - 获取当前文件的绝对路径,但是不包含文件名,这样我们就可以自己拼接自己需要的路径
    3exports - 空对象,放在里面的东西,就是可以公开给别的模块使用的
    4require - 函数,调用它就可以引入其他分支模块
    5module - 指代当前模块本身,甚至包含着以上4个操作,exports=module.exports
    6、定时器 - 用法和以前一样
    7console - 用法和以前一样

(2)querystring - 解析查询字符串部分的一个模块

        需要引入:var qs=require("querystring");
        APIvar obj=qs.parse("查询字符串");

(3)url - 解析url的一个模块

    需要引入:var url=require("url");
    APIvar objUrl=url.parse("url",true);
    重点:
            1、请求消息:objUrl.query.键名;
            2、路由:objUrl.pathname;

(4)Buffer - 不需要引入,可以看作是Node.js的一种新的数据类型

(5)fs - 文件系统模块


   需要引入:var fs=require("fs");
            异步读:
                    fs.readFile("文件路径",(err,buf)=>{
                            读取到了要干什么,必须放在这里面
                    })

            异步写:- 会把原来的东西替换掉
                    fs.writeFile("文件路径","新内容"/buf,(err)=>{
                            写入完了要干什么,必须放在这里面
                    })

            异步追:- 不会把原来的东西替换掉
                    fs.appendFile("文件路径","新内容"/buf,(err)=>{
                            写入完了要干什么,必须放在这里面
                    })


(6)http模块:搭建服务器&文件系统


    var http=require("http");
	var url=require("url");
	var fs=require("fs");
	var app=http.createServer();
	app.listen(80);
	app.on("request",(req,res)=>{
		var objUrl=url.parse(req.url,true)
		var router=objUrl.pathname;//甚至昨天没用到的请求消息:objUrl.query.键名; - 是一个对象
		if(router=="/"||router=="/index.html"){
			fs.readFile("文件路径",(err,buf)=>{
				res.end(buf);//一个请求只能有一个响应
			})
		}else if(router.match(/html/)!=null){
			fs.readFile("./public/html"+router,(err,buf)=>{
				res.end(buf);//一个请求只能有一个响应
			})
		}else if(router.match(/css|js|.../)!=null){
			fs.readFile("./public"+router,(err,buf)=>{
				res.end(buf);//一个请求只能有一个响应
			})
		}else if(router=="login/register/getNews...")
	})

2.第三方模块 - 在npm这个网站上放着的,可以在cmd 使用npm i 包名去下载

3.自定义模块:引入时必须这么写:require("./文件路径");

mongodb数据库

一、安装&启动

1.解压mongodb-win32-x86_64-2008plus-ssl-3.6.11.zip文件

2.打开bin文件夹,里面有:mongo.exe(客户端) 和 mongod.exe(服务器端)

3.如何启动:

(1)在bin文件夹中打开cmd:输入:.\mongod.exe --dbpath=你想要保存的绝对文件夹路径

(2)不要关闭mongo服务器端的cmd

(3)再打开一个cmd:输入:.\mongo.exe - 再上一个cmd可以查看我们是否连接成功 - 客户端开启成功

4.操作命令

(1)数据库的操作

    1、查询所有数据库:show dbs
    2、创建/切割数据库:没有就创建,有了就切换:use 数据库名称
    3、查看当前选中的数据库:db
    4、创建数据表:db.createCollection("表名");- 没有限制,无限,一定要先创建数据表后,我们才能查看到自己创建的数据库
    5、删除数据库:db.dropDatabase(); - 一旦删除就不能恢复,不推荐,因为要坐牢,最好忘记

(2)数据表的操作

    1、创建数据表:db.createCollection("表名",{size:5242880,capped:true,max:5000}); - 最大存储空间为5mb,最多存储5000个,意味着这个数据表做了限制,不推荐
    2、查看目前所有的数据表:db.getCollectionNames();
    3、删除数据表:db.表名.drop(); - 一旦删除就不能恢复,不推荐

(3)数据的操作

1、增:db.表名.save({键值对,...}) - 一次只能插入一条数据
   db.表名.save(\[{},{},{},{},....]) - 一次插入多条数据
    举例:
    db.user.save({name:"paoge",pwd:"123123",age:18,email:"<pg@qq.com>",vip:1})
    db.user.save(\[{name:"hujiayuan",pwd:"333333",age:17,email:"<hjy@qq.com>",vip:0},  
    {name:"luohongliang",pwd:"666666",age:16,email:"<lhl@qq.com>",vip:0},
    {name:"zhaoxiao",pwd:"999999",age:64,email:"<zx@qq.com>",vip:1}])
    
 2、删:db.表名.remove({}) - 不推荐,删除数据库中所有的数据
 
     db.表名.remove({条件}) - 条件依然也是键值对,
     比如: db.user.remove({name:"paoge1"}) - 会删除数据表中name叫做paoge1的所有数据
 
 3、改:db.表名.update({条件},{$set:{新内容}})
    举例:db.user.update({name:"zhaoxiao"},{$set:{age:65,pwd:"222222"}})
    
 4、查:db.表名.find(); - 找所有
    db.表名.find({pwd:"666666"}); - 找到所有密码为666666的数据
    db.表名.find({},{name:1,pwd:1}); - 找到所有的数据,但是只返回name和pwd(登录!)
    db.表名.find().sort({age:1}); - 按age升序排列!
    db.表名.find({age:{$gte:18}}) - 拿到所有age大于等于18的数据,gt大于 gte大于等于 lt小于  lte小于等于(获取成年人)
    db.表名.find({name:/o/}) - 甚至可以用正则(模糊查询)
    db.表名.find().skip(5).limit(5) - 跳过前5条,在拿5条数据,理解为5-10条数据(点击分页条应该拿到哪些数据)
    db.表名.find().count() - 获取到此表有多少条数据(做出分页条)


二、Node.js操作mongoDB - Node.js官方并没有提供过操作数据库的API

1.安装第三方模块:mongoose

2.使用步骤:

(1)引入:var mongoose=require("mongoose");

(2)连接数据库:mongoose.connect("mongodb://127.0.0.1/h52302");

(3)创建出一个新的数据表的同时,设置数据类型的控制,防止用户乱输

     var UserSchema=mongoose.Schema({
    name:String,
    pwd:String,
    age:Number,
    email:String,
    vip:String
    })
    //		模型名随意的        数据的控制         表名,没有则为创建,有了则为选中!
    var User=mongoose.model("User",UserSchema,"user")

(4)增:2步

   1、创建要插入的对象
        var x=new User({
        name:"袍哥1",
        pwd:"123456",
        age:"123",
        email:"<pg@qq.com>",
        vip:"1"
        })
2、创建好的对象插入到数据表中
    x.save().then(()=>{
    console.log("插入完毕了,你要干什么,必须放在这个里面,因为他也是异步")
    })

(5)删:

    User.deleteOne/deleteMany({条件}).then(()=>{
    console.log("删除完毕了,你要干什么,必须放在这个里面,因为他也是异步")
    })

(6)改:


            User.updateOne/updateMany({条件}).then(()=>{
                    console.log("修改完毕了,你要干什么,必须放在这个里面,因为他也是异步")
            })

(7)查:

```js
   	User.find({条件}).then((rs)=>{
			rs->查询到的数据
		})


	目前:前端能传到后端的技术,只有一个:form表单,action属性可以随便自定义一个路由名称,后端解析此路由就可以通过Object.query.键名得到前端传来的东西