nodejs
- 介绍 2
- 常用函数/方法 4
- node模块学习 4
- 前后数据交互 22
- mongodb 25
- node连接mongodb 35
(附实例一篇)https://coding.net/u/oTToTT/p…
阅读本文需要js基础
1.介绍
1.1.什么是 node
1.1.1.node 是一个开发平台, 就像 Java 开发平台、.Net 开发平台、一样有对应的编程语言、有语言运行时、有能实现特定功能的 API
1.1.2.使用的编程语言: javascript 语言
1.1.3.node.js 平台是基于 Chrom V8 javascript 引擎构建 (简称: V8 引擎)
1.1.4.可以开发控制台程序(命令行程序)、桌面应用程序(GUI)(借助 node-webkit、electron 等框架实现)、Web 应用程序(网站)
1.2.特点
1.2.1.事件驱动
触发事件执行回调函数
1.2.2.非阻塞I/O
文件读写与网络传输采用异步操作不会阻塞程序执行
1.2.3.单线程 主要目的减少内存开销
1.2.4.拥有开源开发生态系统NPM
1.3.学习资源
1.3.1.CNODE社区 https://cnodejs.org
1.3.2.雪球上的 http://mengxy.net/slides/node…
1.3.3.Node.js包教不包会https://github.com/ppker/node…
2.常用函数/方法
2.1.__dirname 方法 返回服务器的绝对路径
3.node模块学习
3.1.node将功能封装在不同分模块,如果要使用必须引入模块
3.1.1.语法:var fs = require(“”fs””);
3.1.2.引入: 引入模块时,变量名最好和模块名一样
3.2.path模块
3.2.1.var path = require(‘path’);用户格式化路径
3.2.2.path.join(__dirname,’./htmls/index.html’) 路径拼接
3.3.querystring模块
3.3.1.var querystring = require(‘querystring’)
3.3.2.querystring.parse( str )
将查询字符串换成对象
3.4.ur模块
3.4.1.var url = require(‘url’)
3.4.2.将uri转换成对象
3.4.3.u语法:url.parse( uri,true ),query
3.5.mime模块
3.5.1.下载依赖包 npm i mime -s
3.5.2.var mime = require(“”mime””);
3.5.3.语法:mime.parse( “”./文件名”” ) 根据后缀名返回mime类型
3.6.underscore模块
3.6.1.下载依赖包:npm i underscore -s;
3.6.2.引入文件 var _ = require(‘underscore’);
3.6.3.使用
3.6.3.1.创建模版函数
var tplFn = _.template( str );
3.6.3.2.填充数据: tplFn( { 数据对象} );
模版内识别<%%>语法 可以使用对象的任何属性
3.7.fs(文件读写)模块
3.7.1.引入模块 var fs = require(“”fs””);
3.7.2.异步读取文件(推荐)
3.7.2.1.语法:fs.readFile(“”路径””,“编码”,function( 错误信息, 数据 ){ })
3.7.2.2.参数解释
3.7.2.2.1.参数1:文件路径
3.7.2.2.2.参数2: 以什么格式读取出来 如果读取文件时没有指定编码,那么返回的将是原生的二进制数据<Buffer>;如果指定了编码,那么会根据指定的编码返回对应的字符串数据
3.7.2.2.3.参数3:读取完毕后的回调函数
3.7.2.3.回调函数参数
3.7.2.3.1.参数1:错误信息
3.7.2.3.2.参数2:读取到的数据信息
3.7.3.异步写入文件(推荐)
3.7.3.1.语法:fs.writeFile(‘路径’,写入数据,编码,function (err){ }
3.7.3.2.参数解释
3.7.3.2.1.参数1:文件路径
3.7.3.2.2.参数2:要写入的数据(字符串)
3.7.3.2.3.参数3:编码格式(可选)
3.7.3.2.4.参数4:回调函数
3.7.3.3.回调函数参数:
3.7.3.3.1.错误信息
3.7.4.同步读取文件(如非必须不推荐)
3.7.4.1.语法:var data = fs.readFileSync(‘./data1.txt’,’utf8′);
3.7.4.2.同步读取文件需接受函数返回值,一般来说用try …catch()捕获异常
3.7.4.3.参数解释:
3.7.4.3.1.参数1:路径
3.7.4.3.2.参数2:编码格式
3.8.http网络模块
3.8.1.引入模块:var http = require(“”http””);
3.8.2.创建服务步骤
3.8.2.1.创建 http 服务
3.8.2.1.1.var server = http.createServer();
3.8.2.2.注册请求事件
3.8.2.2.1.server.on(‘request’,function (req,res) { }
req为请求对象,包含客户端所有请求信息
res是服务器响应对象,所有响应操作都需要通过这个对象
3.8.2.3.监听端口
3.8.2.3.1.server.listen(9000,function () {
console.log(‘服务已经启动,请访问: http://127.0.0.1:9000′)
})
3.8.3.请求对象req(请求事件第一个形参)
3.8.3.1.req.url() //请求路径
3.8.3.2..headers 请求头 (对象)
3.8.3.3.req.method 请求方式””GET””||””POST””
3.8.3.4..httpVersion http 版本
3.8.4.响应对象res(请求事件第二个形参)
3.8.4.1.设置编码:res.setHeader(‘Content-Type’,’text/plain ; charset=utf-8′)
3.8.4.2.res.write(‘hello wrold’);//返回数据 (注意数据会跟end()数据合并发送)
3.8.4.3..statusCode 设置或者读取 http 状态码
3.8.4.4..statusMessage 设置或读取 http 响应状态消息
3.8.4.5..writeHead(statusCode [, statusMessage]_[, headers]) 设置响应头信息(此法是上面的合写)
3.8.4.6.结束响应并返回数据:res.end(数据[, callback])
3.9.express模块
3.9.1.创建服务器步骤
3.9.1.1.下载引入模块
npm i express -s
var express = require(“”express””);
3.9.1.2.初始化:var app = express()
3.9.1.3.注册请求处理事件:
3.9.1.3.1.app.get(‘/index.html’,function(){…} )
3.9.1.3.2.app.post(‘路径’,处理函数)
3.9.1.3.3.app.use(‘路径’,处理函数 )
post/get严格判断路径。而use则判断以参数开头的路径请求
3.9.1.4.监听端口:app.listen(8080,function(){ … })
3.9.2.router中间件使用
3.9.2.1.创建路由对象:var router = express.Router()
3.9.2.2.添加路由方法
3.9.2.2.1.router.get( “”/index.html””,function(){} )
3.9.2.2.2.app.use(‘路径’,处理函数 )
3.9.2.3.挂载路由到服务
app.use(“”/””,router);
3.9.3.返回数据
3.9.3.1.app.send( ) 基于res.end()的封装 返回数据
参数可以是任意类型,内部自动处理
3.9.3.2.app.sendFile( “路径”,function(err){…} ) 读取文件并返回
3.9.3.3.静态文件返回
router.use(“”/静态文件目录””,express.static(“”./目录””));
3.9.4.重定向 res.redirect( “”/”” );
3.9.5.获取前台传递数据
3.9.5.1.get请求:req.query 返回处理后的对象吧
3.9.5.2.post请求 借助中间件
3.9.5.2.1.下载引入body-parser
npm i body-parser -s
3.9.5.2.2.引包 var bodyParser = require(“”body-parser””)
3.9.5.2.3.配置:app.use(bodyParser.urlencoded({extended:false}))
参数:false 字符串 、数组 true : 任意
3.9.5.2.4.调用 req.body 返回请求体对象
3.9.6.ejs模版渲染
3.9.6.1.设置步骤
3.9.6.1.1.设置模板文件路径 app.set(“”views””,文件夹绝对路径)
3.9.6.1.2.自定义模板:app.engine(“”html””,require(“”ejs””).renderFile)
参数1:自定义模版名称 参数2: 模版引擎
3.9.6.1.3.指定渲染模版app.set(“”view engine””,””html””);
3.9.6.2.在请求事件中调用渲染
3.9.6.2.1.res.render( “”文件名””,“数据” )
3.10.async模块
3.10.1.第一步 var async = require(“”async””)
3.10.2.第二步 async.parallel({函数对象集合},所有函数执行完之后的回调函数(err,result){})
4.前后数据交互
4.1.获取数据
4.1.1.前数据在requestd对象中,通过操作该对象获取数据
4.1.2.get请求获取
4.1.2.1.通过解析req.url获取
4.1.2.2.方法:url.parse(req.url,true)获取到一个对象
4.1.3.post请求获取
4.1.3.1.需要监听数据传输
4.1.3.2.第一步:注册数据传输事件,并将数据片段存储到数组中
var temp = [];
req.on(“”data””,function( v ){ temp.push( v ) })
4.1.3.3.第二步:注册数据传输结束事件,将接受到数据片段数组转换成buffer,并转换成查询字符串
req.on(“”end””,function(){ temp = Buffer.concat( temp ).tostring(); })
4.2.返回数据
4.2.1.通过response对象的end()方法返回
5.mongodb
5.1.介绍
5.1.1.MongoDB是一个跨平台,面向文档的数据库,高性能,高可用性和易于扩展
5.1.2.mongo中的数据库:是一个集合的物理容器,一个单一的MongoDB服务器通常有多个数据库。
5.1.3.mongo中集合是一组MongoDB的文件。简单理解就是一个数组 (集合里面存放 json 对象 collection(‘one’)
5.1.4.文档是一组键值对。(可以认为是 json 格式,但其实是 bson, bson 基于 json 格式)
5.2.连接启动
5.2.1.创建目录 c:datadb
5.2.2.命令行输入 mongod 启动服务(如果是c盘直接启动)其他盘符需要mongod –dbpath 目录
5.2.3.在新的 cmd 窗口 通过 mongo 命令连接数据库服务器
【也可以指定连接的主机名和端口号:`mongo –host 127.0.0.1 –port 27017】
5.3.操作指令
5.3.1.show dbs 查看所有数据库
5.3.2.ues 库名 切换 / 创建数据库 如果创建的数据库为空那么将不会保存创建信息
5.3.3.db 显示当前数据库名
5.3.4.show collections 查看当前数据库中所有的集合
5.3.5.插入数据:如果没有集合创建,存在既添加
db.集合名.insertOne({键:值}) 插入一条
db.集合名.insertMany([{},{}]) 插入多条数据
5.3.6.db.集合.find() //查找集合中的所有数据
db.集合.find({条件对象}) //查找符合条件的数据
db.集合.find({age:{$gte:””18″”}})查询age大于等于18的文档
5.3.6.1.$gt 大于
$lt 小于
$e 等于
$ne不等于
5.3.7.db,集合.updata({条件对象},{值对象}) 更新替换符合条件的一条数据
db.集合.updata({条件对象},{$set:{值对象}}) 更新符合条件的一条数据
db.集合.updata({条件对象},{$set:{值对象}},{multi:true}) 更新符合条件的多条数据
5.3.8.db.集合.remove({条件对象}) 删除符合条件的数据
5.3.9.db.集合.drop()删除集合
5.3.10.db.dropDatabase()删除库
6.node连接mongodb
6.1.加载mongodb模块 var mongodb = require(‘mongodb’)
6.2.获取数据库客户端对象
var client = mongodb.MongoClient
6.3.准备连接字符串
var host = “”mongodb://127.0.0.1:27017″”
6.4.连接数据库:
client.connect(host,functiont( err,use ){ 通过use形参操作数据库 });
6.5.将字符串id转换成mongoId
mongodb.ObjectId( req.query.id )
6.6.插入数据
use.db(“”数据库名””).collection(“”集合名””).insertOne({数据对象}, function(err,info) { //err:错误对象 ;info返回操作信息});
6.7.findOne( {条件} , callback(err,doc) )查询一条
use.db(“”库名””).collection(“”集合””).find().toArray(function(err,info){ }) 查询全部
6.8.更新数据
- 单条: update ( {条件} , { $set: {更新字段 }} , callback )
- 多条 : update Many ( {条件} , { $set: {更新字段 }} , callback )
- 替换 : update ( {条件} , {更新字段 } , callback )
6.9.- 删除单条: deleteOne ( {条件} , callback )
- 删除多条: deleteMany ( {条件} , callback )
6.10.关闭连接 use.close()