Node学习笔记
安装环境
- 下载地址:https://nodejs.org/en/download
- 安装
- window 下载对应版本,按提示就可以
- 确认是否安装成功
- 打开命令行,输入
node --version
- 或者
node -v
- 打开命令行,输入
- 执行文件
- 打开命令行,进入对应的文件夹。输入
node hello.js
- 打开命令行,进入对应的文件夹。输入
Node.js入门
Node中的javaScript
-
EcmaScript
-
核心模块
-
第三方模块
-
用户自定义模块
Node中的模块系统
fs 文件操作模块
fs.readFile
var fs = require('fs');
/**
* @param path:文件路径
* @param [charset]:读取字符格式 可以省略,默认为16进制格式
* @parm callback:回调函数
*/
fs.readFile('./views/index.html','utf-8',function(err,data){
//通过判读err是否存在,判断文件是否读取失败
if(err){
return console.log('读取文件失败!');
}
return data;
})
fs.writeFile
var fs = require('fs');
/**
* @param path:文件路径
* @param data:存储数据
* @param callback:回调函数
*
*/
fs.writeFile('./db/data.json',{id:1,name:'xiao'},function(err){
if(err){
return console.log('文件存储失败');
}
console.log('文件存储成功');
});
http 网络模块
简单http服务实例
-
方式一
//引入http模块系统 var http = require('http'); //构建服务为 var server = http.createServer(); //监控服务信息交互 server.on('request',function(requesst,response){ response.end('hello world!'); }) //启动监控端口 第一个参数为监控端口 server.listen(3000,function(){ console.log('Server 3000 Running....') })
-
方式二(简化写法)
//引入http模块系统 var http = require('http'); //构建服务 http.createServer(function(request,response){ response.end('hello world!'); }).listen(3000,function(){ console.log('Server 3000 Running....') })
url 地址格式化模块
通过npm安装常用工具
nodemon 自动重启工具
#安装
npm install --global nodemon
#查看版本
nodemon --version
#使用自定启动方式启动node.js文件
nodemon app.js
Express框架使用
安装
- 官方说明文档 http://expressjs.com/en/starter/installing.html
- 初始化目录
npm init -y
- npm安装express包
npm install express --save
简单使用
-
创建入口文件 app.js
//引用express var express = require('express'); //创建app对象 var app = express(); //开放访问资源文件夹 app.use('/public/',express.static('./public/')); //get方式访问 app.get('/',function(request,response){ response.send('Hello World!'); }) //post方式访问监控 app.post('/',function(request,response){ response.send('Hello World!'); }) //启动监控端口 app.listen(3000,function(){ console.log('Server 3000 Running....'); })
Express中使用art-template
-
安装相关依赖包
- 安装art-template依赖包
npm install art-template --save
- 安装express-art-tmplate依赖宝
npm install express-art-tmplate --save
- 安装art-template依赖包
-
代码中注册依使用
//引入相关依赖包 var express = require('express'); var fs = require('fs'); //注册http服务 var app = express(); //注册art-template模板引擎 app.engine('html',require('express-art-template')); //监控GET访问的 ‘/’路径 app.get('/',function(request,response){ var students = []; fs.readFile('','utf-8',function(err,data){ if(err){ return response.status(500).send('500 服务器错误'); } // console.log(data); students = JSON.parse(data).students; response.render('index.html',{ headerList:[ {name:'苹果',color:'#F00',des:'这是一个好吃的苹果'}, {name:'雪梨',color:'#fff906',des:'这是一个好吃的雪梨'}, {name:'西瓜',color:'#0F0',des:'这是一个好吃的西瓜'}, {name:'葡萄',color:'#ff0c6e',des:'这是一个好吃的葡萄'}, {name:'苹果',color:'#F00',des:'这是一个好吃的苹果'}, {name:'雪梨',color:'#fff906',des:'这是一个好吃的雪梨'}, {name:'西瓜',color:'#0F0',des:'这是一个好吃的西瓜'}, {name:'葡萄',color:'#ff0c6e',des:'这是一个好吃的葡萄'}, ], students:students, }); }) }); app.listen(3000,function(){ console.log('Server 3000 Running....'); })
Express中的路由Rouster
-
新建路由文件 router.js文件,文件内容如下
//引入相关依赖包 var express = require('express'); var fs = require('fs'); //注册路由容器 var router = express.Router(); //挂载相关路由 router.get('/',function(request,response){ var students = []; fs.readFile('./db/student.json','utf-8',function(err,data){ if(err){ return response.status(500).send('500 服务器错误'); } //把文件字符串内容转为json对象 students = JSON.parse(data).students; //通过art-template模板引擎进行渲染 response.render('index.html',{ students:students, }) }) }); module.exports = router;
-
使用路由可以实现逻辑模块分离,入口app.js专注逻辑,引入路路由文件如下
//引入相关依赖包 var express = require('express'); var router = require('./router'); //创建http服务 var app = express(); //开放访问目录 app.use('/public/',express.static('./public/')); app.use('/node_modules/',express.static('./node_modules/')); //注册art-template模板引擎 app.engine('html',require('express-art-template')); //使用路由 app.use(router); //开启监控端口 app.listen(3000,function(){ console.log('Server 3000 Running....') });
-
上述引入的
./db/student.json
文件内容如下{ "students": [ {"id":1 ,"name": "张三","age":18 ,"gender":0 ,"hobbies": "吃饭、睡觉、打豆豆"}, {"id":2 ,"name": "李四","age":18 ,"gender":1 ,"hobbies": "吃饭、睡觉、打豆豆"}, {"id":3 ,"name": "王五","age":18 ,"gender":0 ,"hobbies": "吃饭、睡觉、打豆豆"}, {"id":4 ,"name": "赵六","age":18 ,"gender":0 ,"hobbies": "吃饭、睡觉、打豆豆"}, {"id":5 ,"name": "钱七","age":18 ,"gender":1 ,"hobbies": "吃饭、睡觉、打豆豆"}, {"id":6 ,"name": "牛八","age":18 ,"gender":0 ,"hobbies": "吃饭、睡觉、打豆豆"} ] }
Express中POST处理
-
安装body-parser中间件
- 安装
npm install body-parser --save
- 安装
-
使用说明文档 http://expressjs.com/en/resources/middleware/body-parser.html
-
代码中注册使用
var express = require('express') var bodyParser = require('body-parser') var app = express() // parse application/x-www-form-urlencoded app.use(bodyParser.urlencoded({ extended: false })) // parse application/json app.use(bodyParser.json()) app.use(function (req, res) { res.setHeader('Content-Type', 'text/plain') res.write('you posted:\n') res.end(JSON.stringify(req.body, null, 2)) })
MongoDB
安装
- 下载地址: https://www.mongodb.com/download-center#community
- 安安装步骤:根据提示,按下一步安装即可
- 配置环境变量:把安装执行文件配置到电脑环境变量中;C:\Program Files\MongoDB\Server\3.6\bin;
- 查看是否安装成功 命令行输入:
mongod --version
入门
-
参考菜鸟教程: https://www.runoob.com/mongodb/mongodb-tutorial.html
-
启动
#mongod 默认是由执行 mongod 命令所处盘符根目录下的 /data/db 作为自己的数据存储目录 #所以在第一次执行该命令之前,先自己手动新建一个 /data/db目录 #没有改目录执行 mongod 是会 shutting down with code:100 启动后关闭 mongod
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F5FKysMw-1571460653232)(C:\Users\rufeike\AppData\Roaming\Typora\typora-user-images\1571043604442.png)]
-
修改存储路径
mongod --dbpath=数据库存储目录路径
-
关闭数据库 命令行直接
ctrl+c
即可停止 -
连接和退出数据库
-
连接
#该命令默认连接本机的MongoDB 服务 mongo
-
退出
#在连接状态下 输入 exit 回车即刻退出连接 exit
-
基本命令
-
查看显示所以数据库
show dbs
-
查看当前操作的数据库
db
-
显示当前数据库的所有集合
show collections
-
查看数据表数据库
db.数据库.find()
-
切换数据库 (如果没有,则会创建数据库)
use 数据库名称
-
查看数据库
show collections
-
删除数据库
db.数据库名.drop()
Node连接MongoDB
安装依赖
-
使用官方mongodb包操作(不推荐使用,操作麻烦)
https://github.com/mongodb/node-mongodb-native
-
使用第三方mongoose包来操作
http://www.mongoosejs.net/
mongoose参考文档使用
- 官方指南: http://www.mongoosejs.net/docs/guide.html
快速入门
连接说明
//引入相关依赖库
var mongoose = require('mongoose');
//连接数据库
mongoose.connect('mongodb://localhost/test',{ useNewUrlParser:true,useUnifiedTopology: true },function(err){
if(err){
return console.log('数据库连接失败');
}
console.log('数据库连接成功!');
});
//添加成功提醒和失败警告
var db = mongoose.connection;
db.on('error',console.error.bind(console.log,'connection error'));
db.on('open',function(){
//写业务代码
....
})
入门案例
//使用前提已经安装node.js和mongodb数据库
//第一步:导入依赖包
var mongoose = require('mongoose');
//第二部:连接数据库test
mongoose.connect('mongodb//localhost/test');
//第三步:设置schema(集合结构)
var Schema = mongoose.Schema;
var userSchema = new Schema({
username:{
type:String,
required:true
},
password:{
type:String,
required:true
},
email:{
type:String
}
});
//第四步:把文档结构发布为模型
/*
mongoose.model('User',userSchema,[指定数据表]) 方法就是用来将一个Schema框架发布为model
第一个参数:传入一个首字母大写的单数字符串用来表示数据库名称,mongoose会自动把该字符串生产小写复数的集合名称
第二个参数:用户表结构
第三个参数:选填,可以指定表
返回值:模型构造函数
例如:User 最终变成 users 集合名称
*/
var User = mongoose.model('User',userSchema);
//第五步:使用model构造函数进行添加数据(实力化一条数据)
var admin = new User({
username:'admin',
password:'123456',
email:'qq21323@qq.com'
})
//第六步:把数据库进行持久化(存入数据库)
admin.save(function(err,ret){
if(err){
console.log('保持失败');
}else{
console.log('保持成功');
//ret为存储成功返回的对象
}
})
关于Schema数据定义结构
方式一(属性直接赋值字符类型):
var Schema = mongoose.Schema;
var blogSchema = new Schema({
title:String,
author:String,
body:String,
comments:[{body:String,date:Date}],
date:{type:Date,default:Date.now},
hidden:Boolean,
meta:{
votes:Number,
favs:Number
}
});
方式 二(属性改成对象赋值):
var Schema = mongoose.Schema;
var blogSchema = new Schema({
title:{
type:String,//字符串格式
require:ture,//必须填写
default:0,//指定默认参数
trim:true,//去左右空格
lowercase:true,//转小写
},
author:{
type:String,
require:true
},
gander:{
type:Number,
default:0
}
...
});
Schema集合结构
预定义修饰符
trim、lowcase、uppercase
//引入依赖包
var mongoose = require('mongoose');
//连接数据库
mongoose.connect('mongodb://127.0.0.1:27017',{ useNewUrlParser:true,useUnifiedTopology: true },function(err){
if(err){
return console.log('数据库连接失败');
}
console.log('数据库连接成功');
})
//定义数据集合结构
var Schema = mongoose.Schema;
var userSchema = new Schema({
username:{
type:String,
required:true,
default:'',
trim:true
},
password:{
type:String,
required:true,
trim:true
}
})
//发布为模板
var User = mongoose.model('User',userChema,'users');
自定义修饰符 setter
//引入依赖包
var mongoose = require('mongoose');
//连接数据库
mongoose.connect('mongodb://127.0.0.1:27017',{useNewUrlParser:true,useUnifiedTopology:true},function(err){
if(err){
return console.log('数据库连接失败');
}
console.log('数据库连接成功');
})
//定义数据表集合结构
var userSchema = mongoose.Schema({
username:{
type:String,
required:true,
set:function(params){
return 'rufeike_'+params
}
},
password:{
type:String,
requried:true
}
})
添加索引
//引入依赖包
var mongoose = require('mongoose');
//连接数据库
mongoose.connect('mongodb://127.0.0.1:27017',{useNewUrlParser:true,useUnifiedTopology:true},function(err){
if(err){
return console.log('数据库连接失败');
}
console.log('数据库连接成功');
})
//定义数据表集合结构
var userSchema = mongoose.Schema({
username:{
type:String,
required:true,
unique:true//唯一索引
},
password:{
type:String,
requried:true,
index:true //主键索引
}
})
数据校验
-
内置校验
- requeried:表示这个数据必须传入 true
- match:正则规则,只能用在String类型中
- min:用于Number 类型数据,最大值
- max:用于Number 类型数据,最小值
- enum:枚举类型,要求数据必须满足枚举值 enum:[‘0’,‘1’,‘2’],只能用在String类型
- maxlength:最大长度,只能用在String类型
- minlenght:最小长度,只能用在String类型
match正则用法示例:
//引入依赖包 var mongoose = require('mongoose'); //连接数据库 mongoose.connect('mongodb://127.0.0.1:27017',{},function(err){ if(err){ return console.log('数据库连接失败'); } console.log('数据库连接成功'); }) //定义数据表集合结构 var userSchema = mongoose.Schema({ username:{ type:String, required:true, match:/^sn(.*)/ //数据必须与sn字符开头 }, password:{ type:String, requried:true } ..... })
-
自定义校验
validate实例
//引入依赖包 var mongoose = require('mongoose'); //连接数据库 mongoose.connect('mongodb://127.0.0.1:27017',{},function(err){ if(err){ return console.log('数据库连接失败'); } console.log('数据库连接成功'); }) //定义数据表集合结构 var userSchema = mongoose.Schema({ username:{ type:String, required:true, validate:function(params){ return sn.length >= 10; } //通过返回值true与false进行判断,true通过,false不通过 }, password:{ type:String, requried:true } ..... })
增、删、改、查
增加
//User为根据userSchema发布的模板
var admin = new User({
username:'admin',
password:'123456',
email:'qq21323@qq.com'
})
//把数据库进行持久化(存入数据库)
admin.save(function(err,ret){
if(err){
console.log('保持失败');
}else{
console.log('保持成功');
//ret为存储成功返回的对象
}
})
删除
//User为根据userSchema发布的模板
/*
User.remove({查询字符:条件},function(err,ret){}) err 为查询失败是返回的信息,ret为查询结果集(数组)
*/
User.remove({username:'张三'},function(err,ret){
if(err){
console.log('查询失败');
}else{
console.log(ret);
}
})
修改
根据id修改
//引入数据库
var mongoose = require('mongoose');
//建立连接
mongoose.connect('mongodb://127.0.0.1:27017/users');
//定义一个Schema
var Schema = mongoose.Schema;
var userSchema = new Schema({
username:{
type:String,
required:true
},
password:{
type:String,
required:true
}
});
//发布为模板
var User = mongoose.model("User",userSchema);
//User为根据userSchema发布的模板
/*
User.updateByIdAndUpdate(ID,{键:值},function(err,ret){}) err 为查询失败是返回的信息,ret为查询结果集(数组)
*/
User.updateByIdAndUpdate('5a001b223d23930330',{password:'122'},function(err,ret){
if(err){
console.log('更新失败');
}else{
console.log('更新成功');
}
})
根据条件修改
//User为根据userSchema发布的模板
/*
User.updateByIdAndUpdate(ID,{键:值},function(err,ret){}) err 为查询失败是返回的信息,ret为查询结果集(数组)
*/
User.updateOne({'_id':'5a001b223d23930330'},{password:'122'},function(err,ret){
if(err){
console.log('更新失败');
}else{
console.log('更新成功');
}
})
查询
查询全部
//User为根据userSchema发布的模板
/*
User.find(function(err,ret){}) err 为查询失败是返回的信息,ret为查询结果集(数组)
*/
User.find(function(err,ret){
if(err){
console.log('查询失败');
}else{
console.log(ret);
}
})
查询单个
User.findOne(function(err,ret){
if(err){
console.log('查询失败');
}else{
console.log(ret);
}
})
根据条件查询
//User为根据userSchema发布的模板
/*
User.find({查询字符:条件},function(err,ret){}) err 为查询失败是返回的信息,ret为查询结果集(数组)
*/
User.find({
name:'张三',
password:'12112'
},function(err,ret){
if(err){
console.log('查询失败');
}else{
console.log(ret);
}
})
聚合查询
执行代码示例
//引入相关依赖库
var mongoose = require('mongoose');
//连接数据库
mongoose.connect('mongodb://127.0.0.1:27017:',{useNewUrlParser:true,useUnifiedTopology:true},function(err){
if(err){
return console.log('数据库连接失败');
}
})
//订单数据表结构
var orderSchema = mongoose.Schema({
order_id:String,
uid:Number,
trade_no:String,
all_price:Number,
all_num:Number
});
//把数据库表结构发布为模板
var orderModel = mongoose.model('Order',orderSchema,'order');
//查询如下
orderModel.aggregate([
{
$lookup:{
from:"order_item",
localField:"order_id",
foreignField:"order_id",
as:"items"
}
}
],function(err,ret){
if(err){
return console.log(err);
}
console.log(ret);
})
对应订单列表
//订单表结构
var orderItemSchema = mongoose.Schema({
order_id:String,
title:String,
price:Number,
num:Number
}) ;
var OrderItem = mongoose.model('OrderItem',orderItemSchema,'order_item');