前后端交互数据库MongoDB
本篇主要介绍数据库相关内容以及模板引擎:1、数据库相关1.1为什么要使用数据库动态网站中的数据都是存储在数据库中的数据库可以用来持久存储客户端通过表单存储的用户信息数据库软件本身可以对数据库进行高效管理1.2数据库概念数据库即存储数据的仓库,可以将数据进行有序的分...
本篇主要介绍数据库相关内容以及模板引擎:
1、数据库相关
1.1为什么要使用数据库
- 动态网站中的数据都是存储在数据库中的
- 数据库可以用来持久存储客户端通过表单存储的用户信息
- 数据库软件本身可以对数据库进行高效管理
1.2数据库概念
数据库即存储数据的仓库,可以将数据进行有序的分门别类进行存储,其是独立于语言之外的软件,可以通过API去操作,常见的数据库软件有:mySQL、MongoDB(前端使用较多,因为其是基于JavaScript语言)、oracle…
2、MongoDB
2.1 MongoDB可视化软件
其是提供了图形界面去操作数据库,我们可以通过node.js中的语句(即数据库提供的api去操作数据库,要借助mongoose),也可以通过可视化软件直接去操作数据库(个人感觉相当于管理端电脑一样):
该软件具体界面如下图所示:
2.2 数据库中的层级关系
一个数据库软件可以包括多个数据仓库,而每个仓库下又可以包含多个集合(该仓库中同一类的数数据),每个集合中又可以包含多个文档(具体一条条的数据),而每条数据的属性名称又可以叫做字段,具体如下图所示:
以具体可视化软件举例:
当前软件中有4个仓库(这里除了api外都是软件默认仓库,不能进行操作):
仓库展开后是相应的集合(每个集合中存储一类的信息,如用户本身信息数据、用户所发表的文章数据):
而集合进行展开后则是文档(一条条的数据,其中id是每个文档都独有自己的,后面会用于进行区分):
而上面文档中的属性名称则称为字段;
2.3 mongoose相关
要通过node.js操作数据库,其要在命令行工具中通过npm install mongoose
进行下载;
要对数据库MongoDB进行操作需要先在命令行工具中通过net start mongoDB
启动MongoDB,MongoDB安装时作为一个服务去安装的,所以打开时也是打开服务。
2.3.1连接数据库
在打开MongoDB后则可以操作数据库了,借助mongoose我们可以对数据库进行操作,首先先通过mongoose与要操作的数据库连接:
这里连接的本地下的playground仓库(当不存在时则会自动创建),地址中的mongodb是数据库协议(类似网页有http协议),且其返回是promise对象,所以成功通过then返回,失败通过catch返回;
2.3.2创建集合
在连接上了相应的仓库后便可以在该仓库中创建集合了,其分为两步:
- 设定集合规则
- 创建集合
代码如下:
可以看出主要是用到mongoose中的schema以及model方法,其中model方法中第一个参数是集合名称(首字母要大写),而第二个参数(即集合规则)若短可以直接写对象在其中。model返回的是当前集合的构造函数,如果想往集合中追加内容就要通过该构造函数创建对象先;
2.3.2创建文档
即上面的往集合中追加内容,其也分为两步:
- 创建集合实例
- 调用实例对象下的save方法将将数据保存到数据库中
代码如下:
除了上面方法,直接利用构造函数中的create方法也可以创建:
参数一为文档内容,参数二为回调函数(包含了处理后的结果),但注意其实该方法的返回是个promise对象,所以可以直接通过以下方法获取返回信息:
2.3.3导入数据
如果有时我们数据已经准备好在json文件中准备批量进行导入而不是向现在这样逐条输入,通过如下语句:
如下图则是将user.json文件中的数据导入到playground仓库中users集合中:
(但需要先将MongoDB安装目录下的bin文件夹路径添加到环境变量中)
2.3.4查询文档
1、find()方法,其是集合构造函数的方法,其返回无论有多少个对象(多少条数据),返回的都是数组:
返回示例如下:
find()中可写具体的查询条件,如:
返回User集合中id为以上id的文档,注意查询条件由{}进行包裹;
2、findone()方法,其返回是一条对象数据,如果不输入条件或该条件下数据有多条时,返回的是第一条:
下面介绍多种查询条件,其适用于两种查询方式中:
年龄范围,gt可记为great than而lt可记为less than:
数组项包含某一数据:
结果只显示要查询的字段:
结果如下,只包含name、email属性,id是默认自带的(但也可去掉):
上面如果想取掉默认的id,则在_id前面加一个-即可:
对于数字项进行排序,默认是升序:
如果想要降序则在age前面加-即可:
设置跳过前面多少条数据不查询以及查询只查够多少条数据(对应商城中的跳转第几页以及每页多少条数据):
则上面跳过了两条数据以及限制查询结果只返回两条数据;
2.3.5删除文档
1、删除单个文档,其如果有多条匹配上则删除第一条,返回结果result是被删除的文档:
2、删除多条文档:
其返回结果:
n是受影响数据,ok代表1条删除成功;
2.3.6更新文档
1、更新单个文档,同理若有多个文档符合条件则处理第一个
处理结果如下:
n是受影响的数据,modificied是修改的数据,ok是修改成功的;
2、更新多个文档:
这里第一个参数为空代表对user下所有文档的age都改为56;
2.3.7mongoose验证
在设定集合规则时,可以设置集合验证规则,验证失败就会插入失败,常见规则如下:
上面我们写规则时,每个属性只是一行写明其需要上面数据类型(如string),但如果要写上验证规则则必须对相应的属性用对象来写,且如果加上报错信息的话则要在相应的要求中使用数组写明:
max和min两者是针对数字型数据的,输入的数字范围必须符合该定义;
而default则是当前该项不输入数据时,其会自动设为该数据,下面规定传入数据类型必须是日期类型每当不填时默认为当前日期时间:
enum是限定该项只能填数组后面的值,如下:
validate是自定义验证,则author中传的值为字符串类型,且不能为空,必须长度大于4,validate中的message是错误提示信息:
如果想打印出每一项的报错信息:
2.4 集合关联
通常不同集合中的数据是有联系的,例如文章数据和用户数据是存储在不同集合中的,但文章是由用户,如果要查询文章的所有信息则肯定会有发表者用户的信息,但如果在于文章集合中存储则较为麻烦,此时只需将文章集合与用户集合进行关联即可:
上面分别创建了用户集合和文章集合,然后在文章集合创建时author属性通过id与user进行关联:
然后可以通过populate进行集合关联的查询:
这样进行查询后,author属性的值是user中对应的一大块数据;
2、模板引擎
2.1 模板引擎概念
模板引擎是第三方模块,能让开发者以更加友好的方式拼接字符串,使项目代码更加清晰易于维护;
(在上面没有模板引擎之前,如果想要给客户端返回html界面,若其中有动态生成的内容不需不断循环拼接字符串,十分麻烦):
而模板引擎正是用于解决这类问题,使用后代码可大为化简:
其使用步骤如下:
- 在命令行工具中使用
npm install art-template
进行下载; - 使用const template = require(‘art-template’)引入模板引擎;
- 告诉模板引擎要拼接的数据和模板在哪 const html = template(‘模板路径’,数据);
- 使用模板语法告诉模板引擎,模板应该如何与数据进行拼接;
而在index.art文件中可以直接写,其会自动进行解析,把name和age传入其中:
2.2 模板引擎两种语法
其有标准语法以及原始语法两种:
标准语法简单易写,而原始语法则具有强大的逻辑处理能力,下面语法介绍中两种都会介绍到:
2.2.1输出
将某项数据输出在模板中:
由上看出,在输出中可以进行运算操作,也可以进行判断再进行输出(a为true,则输出b否则输出c);
2.2.2原文输出
此时输出中如果有html标签,则其会当成文本原本进行输出,要进行解析,则:
2.2.3条件判断
可以看出标准语法比原始语法要简单;
2.2.4循环语法
2.2.5子模板
使用子模板可以可以将网站公共区块(头部、底部)抽离到单独的文件中,其是在.art文件中:
如下,分别引入了header.art文件与footer.art文件作为当前html的头部与底部:
2.2.6模板继承
使用模板继承可以将网站HTML骨架抽离到单独的文件中,其他页面模板可以继承骨架文件;
即只在骨架文件中填好相应的坑位后便可:
骨架如下:
block代表相应的坑位,其后面的名字可在嵌入时进行区分;
extend表示继承layout文件中的骨架,并在下面block的相应位置
2.2.7模板配置
其可以:
1、比如说想在.art文件中使用第三方时间处理模块dateFormat,在主文件中:
将其导给模板文件:
则可以在模板文件中使用该模块了:
2、可以设置模板的根目录,一个项目中模板一般放在同一个目录下,所以可以通过设置模板根目录从而不用每次都写详细地址:
正常来说,对模板操作步骤如下,view中存储模板路径:
再于这里进行处理:
而如果设置根目录如下,(__dirname表示当前文件的目录)
则可以省去拼接地址一步:
3、通过设置后缀,上面06.art的后缀也可以进行省略:
在不输入后缀时默认后缀为.art,而在有后缀时则根据其后缀寻找文件;
3、前面总结
1、创建服务器,并通过事件事服务器与客户端进行通信:
2、连接数据库:
但在整体项目中,与数据库相关的文件应该单独放在model文件夹下,连接也应自己有一个文件connect.js,并在主文件中进行引入即可:
3、设置规则,创建集合:
并将student构造函数进行导出,用于在其他文件中使用构造函数创建集合:
在主文件中引入如下:
4、创建路由(这里用到第三方路由模块router)并实现提供模板进行页面传递:
如上面getRouter方法获得了router对象。而get,其可以是post,且其中第一个·参数是不同的地址,第二个参数是回调函数。最后在服务中监听请求时调用该router函数即可,router函数会自动判断请求方式以及地址从而作相应的处理:
且在server中的router方法是可以有第三个参数的,其是个回调函数,当请求结束时会调用该函数:
接下来是要将页面呈现给客户,先建一个views文件夹专门存放模板文件.art,在主文件中引入模板引擎:
配置模板根目录:
在路由中返回相应的模板:
但如果模板文件中有调用css文件进行样式,这样还不能引入css文件,这里要引入静态资源访问模块serve-static,通常在项目中,我们将所有的静态资源放在一个public文件夹中,该模块具体使用如下:
在serve方法中会自动判断是否请求静态资源,如果是则将相应资源返回;
注意serve中的第三个参数同上面的router:
从客户端接收表单信息存储到数据库中:
其中on data时,由于数据不是一次传完,需要不断进行字符串拼接得到完整字符串,on end表示数据传完,则通过异步函数将其写入数据库中(query是将其从字符串变成对象);
writeHead在些完后跳回list页面;
而列表页面则在模版中通过模板引擎进行书写:
但注意这列的dateFormat函数必须按照上面说法进行引入和设置后才可使用;
项目中文件夹相关总结:
- views文件夹用于放模板文件.art
- route文件夹下专门放与路由相关的文件(因为实际项目中路由的内容很多),在该文件中将创建的路由进行导出:
并在主文件中进行导入:
更多推荐
所有评论(0)