思图前端课程后端编程大纲_第1页
思图前端课程后端编程大纲_第2页
思图前端课程后端编程大纲_第3页
思图前端课程后端编程大纲_第4页
思图前端课程后端编程大纲_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、4UJK +VXKYY 3UTMUJH 课程 4UJK PY 简介 4UJK PY 是什么?TUJK PY 不是一种独立的语言,也不是一个PGGYIXOVZ 框架,TUJK PY 是一个让PGGYIXOVZ运行在服务器端的开发。 基于的 引擎 号称目前世界上最快的PGGYIXOVZ 引擎 浏览器组成部分:;/ 界面渲染引擎0GGYIXOVZ 引擎网络4GZOK ;/数据 国内浏览器厂商内核猎豹安全浏览器( 版本为 :XOJKTZ =KHQOZ, 版本为 :XOJKTZ (ROTQ) 安全浏览器( 为 :XOJKTZ, 为 :XOJKTZ =KHQOZ, 为 :XOJKTZ (ROTQ) 极速浏

2、览器( 之前为 :XOJKTZ =KHQOZ 为 :XOJKTZ (ROTQ)傲游浏览器(傲游 、 为 /+ 内核, 为 /+ 与 =KHQOZ 双核)浏览器(早期版本)世界之窗浏览器A C (最初为 /+ 内核, 年采用 )NXUSK /+内核) 浏览器、腾讯 :、淘宝浏览器、搜狗高速浏览器( 为 :XOJKTZ, 及以后版本为 :XOJKTZ =KHQOZ)阿云浏览器(早期版本)、瑞星安全浏览器、闪游浏览器、海豚浏览器( O6GJ TJXUOJ)、;) 浏览器((ROTQ 内核 :XOJKTZ 内核)PGGYIXOVZ 引擎 、)NGQXG 查克拉,/+ 启用的新的 0GG9IXOVZ 引

3、擎。 、99KX3UTQK_ :XGIK3UTQK_ 0GKMKX3UTQK_KX3UTQK_ 应用在3UORRG ,OXKLU ,:XGIK3UTQK_ 应用在3UORRG ,OXKLU 版本,0GKMKX3UTQK_ 应用在 3UORRG ,OXKLU 及后续的版本。 、 应用于 )NXUSK、傲游 。 、4OZXU 应用于 9GLGXO 及后续的版本。 、2OTKGX 2OTKGX ( ,XQ )GXGQGT2OTKGX 应用于 5VKXG 版本,2OTKGX ( 应用于 5VKXG 版本,,应用于 5VKXG 版本,)GXGQGT 应用于 5VKXG 及后续的版本。 、109 1.:3

4、2 对应的 0GG9IXOVZ 引擎。TUJK 能做什么?XQ 具有复杂逻辑的具有社交网络的大规模KH 应用=KH 9UIQKZ 服务器:)6 ;*6 套接字应用程序命令行工具交互式终端程序带有图形用户界面的本地应用程序单元测试工具客户端PGGYIXOVZ 编译器TUJK PY 架构 特点 异步式 / 5 与事件驱动 阻塞和线程 进程 9 线程进程(Pros)是计算机中正在运行的程序的实例。进程是程序的实体。进程是线程的容器。线程,有时被称为轻量级进程(Lightweight Pros,LWP),是程序执行流的最小单元。一个标准的线程由线程 ID,当前指令指针(PC),寄存器集合和堆栈组成。

5、阻塞线程在执行中如果遇到磁盘读写或者网络通讯(I/O 操作),通常要耗费较长的时间,这时候操作系统会这个线程的 CPU 控制权,使其暂停执行,同时将资源让给其他的工作线程,这种线程调度方式称为阻塞。当 I/O 操作完毕,操作系统将这个线程的阻塞状态解除,恢复其对 CPU的控制权,令其继续执行。这种 I/O 模式就是通常所说的同步式 I/O 或阻塞式 I/O 高并发的传统解决方案多线程模型对于高并发的解决方案,传统的架构是多线程模型,也就是为每个业务逻辑提供一个系统线程,通过系统线程切换来弥补同步式 I/O 调用时的时间开销。同步式 / 5举例res=db.query(SELECT * from

6、 some_table); res.output();代码执行第一行,线程会阻塞,等待数据库查询结果/网络通果赋值给 res,res 将结果输出收到结如果同时有上千个任务高并发,不断创建新的线程来处理,浪费系统资源,占用 CPU 时间来处理上下文的切换2-1.3node 的单线程模式异步式请求方式事件队列,事件不断循环举例db.query(SELECT * from some_table,function(res)res.output(););db.save(data);程序执行 db.query 不会等待查询结果,直接执行后面的语句 db.save 的操作,一直执行后面的语句直到进入事件循环

7、,当查询结果返回的时候,会发送一个事件到事件队列,等到事件循环到回调函数的时候,再执行回调函数里面的逻辑。node.js 架构2-2Libev、libeio支持 linux、Mac OS、Unix 等系统的事件驱动、异步式 I/OIOCP支持 Windows 的事件驱动、异步式 I/O3 node 入门3-1node.js 安装3-1.1安装包msi3-1.2选择安装路径(非中文)3-1.3查看版本node -v 基础命令 ROT 常见命令清除屏幕历史:)29结束运行:):82 )*/8 A目录名或文件名C A 9CA =CA 6CA C:列出目录参数: /s 查找子目录 /w 只显示文件名

8、/p 分页 /a 显示隐藏文件示例:DIR format.exe /s查找该盘的 format.exe 文件并位置3* 31*/8 A目录名C:创建目录示例:31*/85=582*创建OWORLD 目录)* ).*/8 A目录名C:进入目录,可以使用相对目录或绝对目录示例:)* 6-+进入当前文件夹下的 PAGE 目录示例:)* 进入上一个文件夹示例:)* B返回根目录示例:)* I BOTJUY进入 c:windows 文件夹示例:* 进入 D 盘目录 切换磁盘8* 83*/8 A目录名C:删除目录示例:8*5=582*删除OWORLD 目录 U =UXRJ1. app.js 中编写 con

9、sole.log(“o World”)2. cd 至 app.js 文件目录,输入 nodeapp.js运行文件3-3建立 HTTP 服务器3-3.1自带http 服务器3-3.2编写代码1、引入 required 模块var http = require(http);2、创建服务器,http.createServer() 方法创建服务器,并使用listen 方法绑定8888 端口。 函数通过 request, response 参数来接收和响应数据。http.createServer(function (request, response) /发送 HTTP 头部HTTP 状态值: 200

10、: OK内容类型: text/plainresponse.writeHead(200, Content-Type:text/plain);/ 发送响应数据 response.end().listen(8888);/ 终端打印如下信息o Worldo Worldn);console.log(Server running at); 两个参数 XKWKYZ XKW 参数 请求事件HTTP 请求一般可以分为两部分:请求头(Request Header)和请求体(Requset Body)。以上内容由于长度较短都可以在请求头完成后立即。而请求体可能相对较长,需要一定的时间传输,因此http.Server

11、Request 提供了以下 3 个事件用于控制请求体传输。data:当请求体数据到来时,该事件被触发。该事件提供一个参数ck,表示接收到的数据。如果该事件没有被,那么请求体将会被抛弃。该事件可能会被调用多次。end:当请求体数据传输完成时,该事件被触发,此后将不会再有数据到来。close: 用户当前请求结束时,该事件被触发。不同于 end,如果用户强制终止了传输,也还是调用 close。 XKYVUTYK XKY 参数 响应方法usCode, headers):向请求的客户端发HTTP 状态码,如 200 (请求成功)、404 (未response.writeHead(s送响应头。susCod

12、e 是找到)等。headers 是一个类似关联数组的对象,表示响应头的每个属性。该函数在一个请求内最多只能调用一次,如果不调用,则会自动生成一个响应头。response.write(data, encoding):向请求的客户端发送响应内容。 data 是一个 Buffer 或字符串,表示要发送的内容。如果 data 是字符串,那么需要指定 encoding 来说明它的编码方式,默认是 utf-8。在 response.end 调用之前,response.write 可以被多次调用。 response.end(data, encoding):结束响应,告知客户端所有发送已经完成。当所有要返回的

13、内容发送完毕的时候,该函数 必须 被调用一次。它接受两个可选参数,意义和 response.write 相同。如果不调用该函数,客户端将永远处于等待状态。 回调函数 事件 事件循环 事件类+KTZ+SOZZKX所有的异步 I/O 操作都会发送一个事件到事件队列。events 模块提供了一个对象:events.EventEmitter。EventEmitter 的就是事件触发与事件器功能的封装。举例var EventEmitter = require(events).EventEmitter; var event = new EventEmitter(); event.on(some_event

14、, function() console.log(some_event 事件触发););setTimeout(function() event.emit(some_event);, 1000);3-4.2EventEmitter 方法1addListener(event, listener)为指定事件添加一个器到器数组的尾部。2on(event, listener)为指定事件一个器,接受一个字符串 event 和一个回调函数。server.on(connection, function (stream) console.log(someone connected!););3once(event

15、, listener)为指定事件一个单次器,即器最多只会触发一次,触发后立刻解除该器。server.once(connection, function (stream) console.log(Ah, we);e ouruser!);4removeListener(event, listener) 移除指定事件的某个器,器 必须是该事件已经过的器。var callback = function(stream) console.log(someone connected!);server.on(connection, callback);/ .server.removeListener(conn

16、ection, callback);序号 方法 & 描述5removeAllListeners(event)移除所有事件的所有器, 如果指定事件,则移除指定事件的所有器。7listeners(event)返回指定事件的器数组。8emit(event, arg1, arg2, .)按参数的顺序执行每个器,如果事件有返回 true,否则返回 false。3-4.3事件继承大多数时候不会直接使用 EventEmitter,而是在对象中继承它。包括 fs、net、http在内的,只要是支持事件响应的模块都是EventEmitter的子类。3-4.4事件循环3-5模块 包monJS 规范3-5.1服务器

17、端 commonJS 规范6setMaxListeners(n)默认情况下, EventEmitters 如果你添加的器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高器的默认限制的数量。模块(modules)包(packages) 系统(system) 二进制(binary)控制台(console)编码(encodings)文件系统(filesystems)套接字(sockets)单元测试(unit testings)3-5.2客户端AMD 规范/CMD 规范AMD 规范require.jsCMD 规范sea.js3-5.3模块(packages)3-5.3.1

18、 模块模块是 node.js 的基本组成部分,一个 node.js 文件就是一个模块,这个文件可能是 javascript 代码,JSON,编译过的 C/C+拓展。文件不仅可以是 JavaScript 代码或二进制代码,还可以是一个文件夹。3-5.3.2 创建模块(重点)exports 是模块公开的接口,require 用于获取一个模块的接口,获取的是模块的 exports 对象。创建举例/ module.js var name;exports.setName=function(n)name=n;;exports.sayconsole.log(o=function(n)o+name);;加载模

19、块/ getModule.jsvar myModule=require(./module);myModule.setName(Jack);myModule.sayo(); 单次加载require 不会重复加载模块,无论调用多少次 require,获得的模块都是同一个。举例/ loadModule.jsvar module1=require(./module); module1.setName(Jack);var module2=require(./module);module2.setName(Rose);module1.sayo(); /Rose说明:SUJRK 的 TGSK 被 SUJRK

20、 的 TGSK 覆盖 覆盖 KVUXZY 对象有时候只是想把一个对象封装到模块中。创建举例/o.jsfunctionvar name;o() this.setName = function(thyName) name = thyName;this.sayo = function() console.log(;o + name);module.exports =o;加载举例/get varoo.jso = require(./o);= newo();o.setName(Tom);o.sayo();说明模块接口的唯一变化是使用module.exports =o 代替了exports.o=o。在外部

21、该模块时,其接口对象就是要输出的exports。o 对象本身,而不是原先的事实上,exports 本身仅仅是一个普通的空对象,即 ,它专门用来接口,本质上是通过它为模块闭包的内部建立了一个有限的接上口。因为它没有任何特殊的地方,所以可以用其他东西来代替,如面例子中的o 对象。3-5.4包(packages)3-5.4.1 包 VS 模块包是在模块基础上更深一步的抽象,Node.js 的包类似于 C/C+ 的函数库或者 Java/.Net 的类库。包通常是一些模块的集合,通常把文件夹封装为一个包。3-6npm(node package manager)3-6.1npm(node package

22、manager)随同 node.js 一起安装的包管理工具允许用户从 NPM 服务器允许用户从 NPM 服务器别人编写的第包到本地使用。并安装别人编写令行程序到本地使用。允许用户将自己编写的包或命令行程序上传到 NPM 服务器供别人使用。3-6.2npm 安装命令1、安装一个包$ npm install npm 在默认情况下会从前目录的 node_modules 子目录下。搜索或包,将装到当2、本地安装 VS 全局安装$ npm install/i package_name默认情况下使用 npm install 命令就是采用本地模式,即把装到当前目录的 node_modules 子目录下。No

23、de.js 的 require 在加载模块时会尝试搜寻 node_modules 子目录,因此使用 npm 本地模式安装的包可以直接被。npm install/i -g package_name全局目录都可以使用本包。多数时候并不是因为许多程序都有可能用到它,为了减少重副本而使用全局模式,而是因为本地模式不会PATH 环境变量。举例说明,安装node-dev 是为了在命令行中运行它,譬如直接运行 node-dev script.js,这时就需要在 PATH 环境变量中node-dev。npm 本地模式仅仅是把装到 node_modules 子目录下,其中的 bin 目录没有包含在 PATH 环

24、境变量中,不能直接在命令行中调用。而当使用全局模式安装时, npm 会将包安装到系统目录, 譬如 /usr/local/lib/node_modules/, 同时package.json 文件中 bin 字段包含的文件会被到 /usr/local/bin/。/usr/local/bin/ 是在 PATH 环境变量中默认定义的,因此就可以直接在命令行中运行 node-dev script.js 命令了。本地安装:为了某一块功能或者某一个项目安装的件夹下全局安装:安装一个工具,在任何目录都可以使用件夹装到你 cd 到的当前文安装到 C 盘一个隐藏的文3-6.3安装node-dev 包node-de

25、v 一个方便程序编写,调试的辅助工具安装:npm install -g node-dev测试:node-dev foo.js3-6.4CommonJS 规范中的包package.json 本包的说明文件,必须在包的顶层目录下;二进制文件应该在 bin 目录下;JavaScript 代码应该在 lib 目录下;文档应该在 JUI 目录下;单元测试应该在 ZKYZ 目录下。 6GIQGMK PYUT 字段说明name - 包名,必须是唯一的,由小写英文字母、数字和下划线组成,不能包含空格。ver- 包的版本号。keywords - descriptionhome关键字- 包的描述。 包的官网 ur

26、l 。author - 包的作者maainers -者数组,每个元素要包含 name、(可选)、web(可选)字段。contributors -贡献者数组,格式与 maainers 相同。包的作者应该是贡献者数组的第一个元素。reitory - 仓库托管地址数组,每个元素要包含 type (仓库的类型,如 git )、url (仓库的地址)和 path (相对于仓库的路径,可选)字段。 main - main 字段是一个模块 ID,它是一个指向你程序的主要项目。就是说,如果你包的名字叫 express,然后用户安装它,然后require(express)。dependencies - 依赖包列

27、表。如果依赖包没有安装,npm安装在 node_module 目录下。会自动将依赖包 TVS 常用命令安装包,YGK 保存依赖项,JK 保存至开发依赖项npm i -save-dev查看已安装包npm list -g卸载安装包npm uninstall package_name -g更新安装包npm update package_name生成 package.json 文件npm initTUJK PY 调试 IUTYURK RUM TUJK PY模块 全局对象 EELORKTGSKEELORKTGSK 表示当前正在执行的 PY的文件名。 EEJOXTGSKEEJOXTGSK 表示当前执行PY

28、所在的目录。 YKZ:OSKUZ YKZKXGR IRKGX:OSKURKGXKXGR VXUY 对象方法 HLLKX 类 作用处理二进制数据,处理 TCP 流或者文件流时,必须使用二进制数据。一个专门存放二进制数据的缓存区。 9ZXKGS 类 作用Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对 http服务器发起请求的 request 对象就是一个 Stream,还有 stdout(标准输出)。文件、写入文件文件系统 异步 /foo/bar/baz/asdfresolve 方法path.resolve(path1, path2.pathn);该方法以应用程序根目

29、录为起点,根据所有的参数值字符串出一个绝对路径。相当于不断的调用系统的 cd 命令。var myPath = path.resolve(path1, path2, a/bc/);console.log(myPath); /E:workspaceNodeJSpath1path2abc4-6路由模块url.parse(string).query|url.parse(string).pathname|querystring(string)foo|querystring(string)o4-6.1url 模块url.parse(urlString)var url = require(url);url.

30、parse(request.url);4-6.2querystring 模块querystring.parse(str, sep, eq, options)querystring.stringify(obj, sep, eq, options)5 express 框架 简介 总结一个基于 4UJK PY的极简、灵活的KH应用开发框架 功能路由控制;模板支持动态视图; 用户会话; CSRF 保护;静态文件服务错误控制器;日志;缓存;插件支持。安装 安装KVXKYYTVS OTYZGRR M KVXKYY 安装项目KVXKYY MKTKXGZUXTVS OTYZGRR M KVXKYY MKTKX

31、GZUX 建立项目KVXKYY GVV 安装依赖包TVS OTYZGRR 启动 KVXKYY 项目TVS YZGXZ 项目文件GVV PYroutesviewspublicbin5-3express 文档(3.x 中文)5-3.1静态文件通过 Express 内置的 express.sic 可以方便地托管静态文件,例如、图标、jQuery/框架、CSS、js、HTML 等。静态文件默认路径 public5-3.2路由控制5-3.2.1工作原理5-3.2.2REST 路由规则1、REST 内容REST 的意思是 表征状态转移(Represenional Se Transfer),它是一种基于 H

32、TTP 协议的网络应用的接口风格,充分利用 HTTP 的方法实现风格接口的服务。HTTP 协议定义了以下 8 种标准的方法。GET:请求获取指定资源。HEAD:请求指定资源的响应头。T:向指定资源提交数据。PUT:请求服务器一个资源。DELETE:请求服务器删除指定资源。TRACE:回显服务器收到的请求,主要用于测试或。CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的服务器。OPTIONS:返回服务器支持的 HTTP 请求方法。2、express 常用方法项目中通过 router 对象操控路由,将上表中的app.get()替换成router.get()即可,其他方法以此类

33、推。注意:router.all():优先经过 all 方法,再传递 next 到后续具体的路由,主要用来做路由控制。5-3.3路径匹配/匹配路径router.get(/user/:username, function(req, res) res.send(user: + req.params.username););TypeExampleTypeExamplePath/ will match paths router use /abcdnextstartingfunctionwithreq/abcdresnextPathPattern/ will match paths router use

34、/abc?dnextstartingwith/abcdand /abdnextfunction req res/ will match paths router use /ab+cdnextstarting with /abcd,function req res/abbcd, /abbbbbcd and so onnext/ will match paths starting with /abcd, /abxcd, /abFOOcd, /abbArcd and so onrouter use /ab*cd function req resnextnext/ will match paths s

35、tarting with /ad and router use /a(bc)?d function req resnext/abcdnextRegularExpres/ will match paths starting with /abc and /xyz router use /abc|/xyz/ function req res nextnextArray/ will match paths starting with /abcd, /xyza, /lmn, and /pqrrouter use /abcd /xyza /lmn|/pqr/nextfunction req res nex

36、t5-3.3.1 路由控制权转移Express 支持同一路径绑定多个路由响应函数。但是需要 next()转移。router.all(/user/*, function(req, res, next) console.log(all methods captured);next(););router.get(/user/:username, function(req, res) res.send(user: + req.params.username););使用场景举例:用户中心的子页面需要验证是否登录。解决方案:结合-parser 中间件,事先检查 req.对象中是否存在用户 id,分情况进行

37、判断。5-3.4请求与响应5-3.4.1 Response 对象res 对象代表了当一个 HTTP 请求到来时,Express 程序返回的 HTTP 响应。在本文档中,按照惯例,这个对象总是简称为 res(http 请求简称为 req),但是它们实际的名字由这个回调方法在那里使用时的参数决定。res.(name,value) 服务器端设置res.end() 之后不要再写代码,写了不会运行,而且报错!res.json() 发送给前端 json 数据 ,之后不要出现 res.end()res.jsonp() 发送给前端 jsonp 数据,处理跨域问题, 之后不要出现 res.end()res.re

38、direct() 路由转向res.render() 配合模板引擎渲染页面res.sus() 发送状态 code200,404,5005-3.4.2 Request 对象req.s获取前端发送来的sreq.body 作用:获取t 方法进来的 data 数据;依赖于 body-parser 组件,需要修改 bodyParser.urlencoded( extended: true )reuery 获取 get 方法地址里面的参数(?uid=23&sex=1)req.params 获取地址里面参数(:username)5-3.5模板引擎服务器5-3.5.1 默认引擎:jadeviews 文件夹存放模

39、板文件,express 使用 res.render 方法渲染模板,先指明具体哪个模板文件,第二参数是数据 data。模板引擎会与 public 下的静态文件,写好一块模板,将文件改名,例如,home.html 改成 home.html.bak5-3.5.2引擎 art-template1、安装npm install art-template save2、参数设置在 app.js 中设置参数如下:/ 引入引擎var artTemplate = require(express-art-template);/ 设置扩展名为.html artTemplate.template.defaults.ext

40、name = .html;/ 设置模板文件夹的路径app.set(views, path.join( dirname, views);/ 设置模板引擎为 artTemplate app.engine(html, artTemplate); app.set(view engine, html);/ 设置测试开发环境app.set(view options, debug: pros.env.NODE_ENV !=production);3、模板语法include 语句6MongoDB 数据库6-1安装1、地址:https/download-munity2、安装默认路径:3、创建数据目录:C:dat

41、adb(默认路径)4、开启数据库服务,路径:C:Program FilesMongoDBServer3.2bin在 cmd 窗口,输入以下指令:cd C:Program FilesMongoDBServer3.2bin mongod直接在 bin 目录,双击打开 mongod.exe32调整命令:mongod -storageEngine=mmapv15、将 MongoDB 服务器作为Windows 服务运行,开机自动运行,注意修改路径mongod.exe -logpath C:datadbConfmongodb.log -logappend-dbpath C:datadb -serviceN

42、ame MongoDB-serviceDisplayName MongoDB -install6-2数据结构6-2.1图形化工具 Robomongo7-2-1-1 安装地址:7-2-1-2 新建连接7-2-1-3数据6-2.2几个概念databasedatabase数据库row数据行/文档indexindex索引primary keyprimary key主键,MongoDB 自动将_id 字段设置为主键6-3mongoose 拓展包6-3.1安装npm install mongoose-save6-3.2连接数据库app6-3.2.1 常用方式var mongoose = require(m

43、ongoose);mongoose.connect(mongodb:/localhost/app); 6-3.2.2 全部方式/方式一:var dbURI = mongodb:/localhost/mydatabase; mongoose.connect(dbURI);/方式二:var dbURI = mongodb:/localhost/myadmindatabase;table joins表连接,MongoDB 不支持columnfield数据字段/域tablecollection数据库表/集合SQL 术语/概念MongoDB 术语/概念解释/说明var adminConnection =

44、 mongoose.createConnection(dbURI);/如果需要端:var dbURI = mongodb:/localhost:27018/mydatabase;/如果需要定义用户名和 var dbURI =:mongodb:/username:passwordlocalhost/mydatabase;/也可以像下面这样传一个对象类型的参数:var dbURI = mongodb:/localhost/mydatabase; var dbOptions =user:db_username,pass:db_password;mongoose.connect(dbURI, dbOp

45、tions);6-3.3侦测连接事件var db = mongoose.connection; db.on(error, console.error.bind(console,error:);connectiondb.once(open, function (callback)/连接之后的事件操作);6-3.4数据操作实例化1、Schema 骨架模板,collectionvar userSchema = mongoose.Schema(: Number, password:String);2、Schema 允许的类型:/举例:var ExampleSchema = new Schema( na

46、me:String,binary:Buffer,living:updated:Date, age:Number,mixed:Schema.Types.Mixed, /该混合类型等同于 nested_id:Schema.Types.ObjectId, /主键_fk:Schema.Types.ObjectId, /外键 array:,arrOfString:String, arrOfNumber:Number, arrOfDate:Date,arrOfBuffer:Buffer,arrOf:,arrOfMixed:Schema.Types.Mixed, arrOfObjectId:Schema.T

47、ypes.ObjectId nested:stuff:String,);3、M,一行var User = mongoose.m默认情况下 mongoose 会根据(User, userSchema);传入的 M名字来生成 collection 名字,在上面的代码中就会生成名为 users(全为小写字母)的 collection(集合);在创建 M的时候定义 collection 的名字:mongoose.m4、Entity 实体( User, userSchema,myuserlist);var user = new User(req.body);放入一个对象跟 schema 定义的对象一样6

48、-3.5增删改查增(添加新数据)user.save(function(err) if(err) console.log(err);res.sus(200).json(info: 失败);return;res.(userName,req.body.);res.redirect(/mobile/activityshop.html);console.log(成功););查(查询数据库)M.findOneUser.findOne(name : Sally, function(err,user) if(!err)console.log(user););M.findUser.find(, function

49、(err, users) if(!err)console.log(users););M.whereUser.find( occupation: /host/ ).where(name.last).equals(Ghost).where(age).gt(17).lt(66).where(likes).in(surf, talking).limit(10).sort(-occupation).select(name occupation).exec(callback);注意:如果不提供回调函数,所有这些方法都返回 Query 对象,它们都可以被再次修改(比如增加选项、键等),直到调用 exec 方

50、法。改(更新已有数据)M有三种方式来更新数据:1.User.update(conditions,update,options,callback);该方匹配到所查找的内容进行更新,不会返回数据;但不能更新主键_id;2.User.findOneAndUpdate(conditions,update,options,callback);该方根据查找去更新数据库,另外也会返回查找到的并未改变的数据;3.User.findByIdAndUpdate(conditions,update,options,callback);该方法跟上面的 findOneAndUpdate 方档并更新的。能一样,不过他是根

51、据 ID 来查找文四个参数conditions:查询条件update:更新的数据对象,是一个包含键值对的对象;新值options:是一个操作类型的选项,这个参数在下面再详细介绍callback:回调函数对于options 参数,在update 方法中和findOneAndUpdate、findByIdAndUpdate两个方法中的可选设置是不同的;/在 update 方法中,options 的可选设置为:是否返回错误信息,默认 true如果查询不到需要更新的数据项,是否需safe:true|false, /upsert:false|true, /要新一条,默认 falsemulti:false

52、|true, /是否可以同时更新多条,默认 falsestrict:true|false /更新的数据中是否可以包含在 schema 定义之外的字段数据,默认 true/对于 findOneAndUpdate、findByIdAndUpdate 这两个方法,他们的options 可选设置项为:new:true|false, /返回的数据时更新后的该是更新前的,如果为true 则返回更新后的,默认 true upsert:false|trure,sort:javascriptObject, /如果查询返回多个文档,则可以进行排序,在这里是根据传入的 javascript object 对象进行排

53、序select:String /这里要返回的字段,值是一个字符串删(删除已有数据)remove(); findOneAndRemove(); findByIdAndRemove();1.2.3.User.remove( name : /Simon/ , function (err) if (!err)/ 删除名字中包含 simon 的所有用户);User.findOne( simontif (!err)user.remove(:,function (err,user)function(err)/ 删除匹配到该邮箱的第一个用户);); 关联表查询 聚合查询6-3.6.1 使用场景个人博客中有文章

54、,一篇文章可以有多个,一个关联多篇文章,两者是多对多关系。现在有 2 个 Schema,分别是 blog、label6-3.6.2 创建 Schema主表 blog/博客 schemavar blogSchema = new mongoose.Schema( title: type: String , /博客题目 abstract: type: String , /摘要 content: type: String , /文章内容 click: type: Number , /点击量 createtime: type: String /消费时间)/创建 m var blogM,第三个参数是实际表

55、名= db.m(blog, blogSchema, blog);子表 label/表var labelSchema = new mongoose.Schema( blogid: type: mongoose.Schema.Types.ObjectId, ref: blog,/这里即为子表的外键,关联主表。 ref 后的 blog 代表的是主表 blog的 M。label: type: String /名);/创建 m var labelM,第三个参数是实际表名= db.m(label,labelSchema,label); 数据/主表中数据var blog=new blogM( . );doc

56、) blog.save(function(err,if (err) return; / 子表中数据,blogid 为刚主表的主键var label = new labelMblogid: doc._id, label: label);(label.save(function(err,doc);); 关联表查询/子表关联主表查询,populate 里面为子表外键labelMdocs) /).find().populate(blogid).exec(function(err, 聚合查询/MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果;

57、 注意_id,num_tutorial 这两个字段都不能变(固 定写法)labelM.aggregate( $group: _id: $label, num_tutorial: $sum: 1 , function(err, docs) console.log(docs) 修改器在 SUTMUJH 中通常文档只会有一部分要更新,利用原子的更新修改器,可以做到只更新文档的一部分键值,而且更新极为高效,更新修改器是种特殊的键,用来指定复杂的更新操作,比如调整、增加、或者删除键,还可以操作数组和内嵌文档。增加、修改或删除键的时候,应该使用 修改器。要把 LUU 的值设置为 HGX 常见的错误做法JH

58、 IURR VJGZK IXOZKXOG a LUU HGX c 这种情况是不对的,实际上这种做把整个文档用a LUU HGX c替换掉,一定要使用以 开头的修改器来修改键 值对。 对单个字段进行修改名称描述$inc根据要添加的值递增该字段的值。$mul将该字段的值乘以指定的值$rename重命名字段$setOnInsert操作时,操作给相应的字段赋值$set用来指定一个键的值,如果不存在则创建它$unset删除一个键$min只有当指定的值小于现有字段值时才更新该字段。$max只有当指定的值大于现有字段值时才更新该字段。$currentDate设置当前日期字段的值,或者作为一个日期或时间戳。 对数组进行修改名称说明$作为一个占位符的更新与查询条件在一个更新的第一要素$addToSet将元素添加到数组中,仅当它们在集合中不存在$pop删除数组的第一个或最后一个项$pullAll从数组中移除所有匹配值$pull移除匹配指定查询的所有数组元素

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论