sublime快捷键
ctrl + D 选中相同的单词
ctrl + shift +左右箭头 选中
ctrl + shift +左右箭头 选中并且选择
// setTimeout
// readFile
// wirteFile
// readdir
// ajax
// 往往异步 API 都伴随有一个回调函数
// var ret = fn()
// $.get('dsadas', fucntion () {})
// var ret = $.get()
function get(url, callback) {
var oReq = new XMLHttpRequest()
// 当请求加载成功之后要调用指定的函数
oReq.onload = function () {
// 我现在需要得到这里的 oReq.responseText
callback(oReq.responseText)
}
oReq.open("get", url, true)
oReq.send()
}
get('data.json', function (data) {
console.log(data)
})
在npm5以前不会有package-lock.json这个文件
npm5以后才有这个文件
当你安装包的时候,都会生成package-lock.json这个文件
npm5以后的安装包不需要加--save 参数,
会自动保存依赖
当你安装包的时候,会自动安装或者更新package-lock.json
这个文件
package-lock.json
这个文件会保存所有node_moudles
中所有包的信息(版本、下载地址)
lock
锁
package-lock.json
会锁住1.1.1,防止自动升级表就是关系
或者表与表之间存在的关系
sql
语言来操作下载
配置环境变量:找到bin目录的路径,放在全局环境变量中,
打开cmd,就可以查询版本
启动方式:
#默认使用执行mongodb命令的所处盘符根目录下的/data/db作为自己的数据存储目录
#如果没有这个目录,则数据库启动不成功,需要手动创建目录
mongod
如果想要修改默认的数据存储目录,则可以:
mongod --dbpath=数据存储目录路径
停止:
ctrl + C
连接:
mongo //该命令默认连接本地服务
退出:
exit
show dbs
db
user 数据库名
插入数据
show collectons
db.数据名.find()
mongoDB
包来操作https://www.npmjs.com/package/mongodb
第三方包:mongoose
基于MongoDB的官方mongodb
包再做了一次封装
官方网站:http://mongoosejs.com
安装:
npm i -S mongoose
hello world
var mongoose = require('mongoose');
// 连接 MongoDB 数据库
mongoose.connect('mongodb://localhost/test', { useMongoClient: true });
mongoose.Promise = global.Promise;
// 创建一个模型
// 就是在设计数据库
// MongoDB 是动态的,非常灵活,只需要在代码中设计你的数据库就可以了
// mongoose 这个包就可以让你的设计编写过程变的非常的简单
var Cat = mongoose.model('Cat', { name: String });
// 实例化一个 Cat
var kitty = new Cat({ name: '喵喵'});
// 持久化保存 kitty 实例
kitty.save(function (err) {
if (err) {
console.log(err);
} else {
console.log('meow');
}
});
var mongoose = require('mongoose')
var Schema = mongoose.Schema//架构
// 1. 连接数据库
// 指定连接的数据库不需要存在,当你插入第一条数据之后就会自动被创建出来
mongoose.connect('mongodb://localhost/itcast')
// 2. 设计文档结构(表结构)
// 字段名称就是表结构中的属性名称
// 约束的目的是为了保证数据的完整性,不要有脏数据
var userSchema = new Schema({
username: {
type: String,
required: true // 必须有
},
password: {
type: String,
required: true
},
email: {
type: String
}
})
// 3. 将文档结构发布为模型
// mongoose.model 方法就是用来将一个架构发布为 model
// 第一个参数:传入一个大写名词单数字符串用来表示你的数据库名称
// mongoose 会自动将大写名词的字符串生成 小写复数 的集合名称
// 例如这里的 User 最终会变为 users 集合名称
// 第二个参数:架构 Schema
//
// 返回值:模型构造函数
var User = mongoose.model('User', userSchema)
var admin = new User({
username: 'zs',
password: '123456',
email: '[email protected]'
})
admin.save(function (err, ret) {
if (err) {
console.log('保存失败')
} else {
console.log('保存成功')
console.log(ret)
}
})
查询所有:
User.find(function (err, ret) {
if (err) {
console.log('查询失败')
} else {
console.log(ret)
}
})
按条件查询所有:
User.find({
username: 'zs',
password:'123456'
}, function (err, ret) {
if (err) {
console.log('查询失败')
} else {
console.log(ret)
}
})//按条件查询=====>数组
按条件查询单个:
User.findOne({
username: 'zs'
}, function (err, ret) {
if (err) {
console.log('查询失败')
} else {
console.log(ret)
}
})//按条件查=====>对象
删除所有:
User.remove({
username: 'zs'
}, function (err, ret) {
if (err) {
console.log('删除失败')
} else {
console.log('删除成功')
console.log(ret)
}
})
根据条件删除一个:
Moudel.findOneAndRemove(conditions,[options],[callback])
根据id删除一个:
Moudel.findByIdAndRemove(id,[options],[callback])
根据条件跟新所有:
Moudel.update(conditions,doc,[options],[callback])
根据指定条件跟新:
Moudel.findOneAndUpdate([conditions],[update],[options],[callback])
根据id更新一个:
User.findByIdAndUpdate('5a001b23d219eb00c8581184', {
password: '123'
}, function (err, ret) {
if (err) {
console.log('更新失败')
} else {
console.log('更新成功')
}
})
function add(x, y) {
console.log(1)
setTimeout(function () {
console.log(2)
var ret = x + y
return ret
}, 1000)
console.log(3)//到这里就执行结束了,不会等后面的定时器。直接返回默认的值undefined
}
console.log(add(1, 2))//----->undefined
//执行顺序:1---3---undefined-----2
不成立的情况:
function add(x, y) {
var ret
console.log(1)
setTimeout(function () {
console.log(2)
ret = x + y
}, 1000)
console.log(3)
return ret
}
console.log(add(1 , 2))//----->undefined
//执行顺序:1---3---undefined-----2
回调函数:
function add(x, y, callback) {
//var x = 10;
//var y = 20;
//var callback = function(ret){ console.log(ret)}
console.log(1)
setTimeout(function () {
var ret = x + y
callback(ret)
}, 1000)
}
add(10, 20, function (ret) {
console.log(ret)
})
基于原生HTTPRequest封装get方法:
function get(url, callback) {
var oReq = new XMLHttpRequest()
// 当请求加载成功之后要调用指定的函数
oReq.onload = function () {
// 我现在需要得到这里的 oReq.responseText
callback(oReq.responseText)
}
oReq.open("get", url, true)
oReq.send()
}
get('data.json', function (data) {
console.log(data)
})
callback hell:(回调地狱)
异步读取文件,无法保证顺序的代码:
var fs = require('fs')
fs.readFile('./data/a.txt', 'utf8', function(err, data) {
if (err) {
// return console.log('读取失败')
// 抛出异常
// 1. 阻止程序的执行
// 2. 把错误消息打印到控制台
throw err
}
console.log(data)
})
fs.readFile('./data/b.txt', 'utf8', function(err, data) {
if (err) {
// return console.log('读取失败')
// 抛出异常
// 1. 阻止程序的执行
// 2. 把错误消息打印到控制台
throw err
}
console.log(data)
})
fs.readFile('./data/c.txt', 'utf8', function(err, data) {
if (err) {
// return console.log('读取失败')
// 抛出异常
// 1. 阻止程序的执行
// 2. 把错误消息打印到控制台
throw err
}
console.log(data)
})
通过回调嵌套的方式保证顺序:
var fs = require('fs')
fs.readFile('./data/a.txt', 'utf8', function (err, data) {
if (err) {
// return console.log('读取失败')
// 抛出异常
// 1. 阻止程序的执行
// 2. 把错误消息打印到控制台
throw err
}
console.log(data)
fs.readFile('./data/b.txt', 'utf8', function (err, data) {
if (err) {
// return console.log('读取失败')
// 抛出异常
// 1. 阻止程序的执行
// 2. 把错误消息打印到控制台
throw err
}
console.log(data)
fs.readFile('./data/c.txt', 'utf8', function (err, data) {
if (err) {
// return console.log('读取失败')
// 抛出异常
// 1. 阻止程序的执行
// 2. 把错误消息打印到控制台
throw err
}
console.log(data)
})
})
})
为了解决以上代码带来的问题(回调嵌套),所以EcmaScript6中新增了一个API,promise
Promise基本语法:
var fs = require('fs')
var p1 = new Promise(function (resolve, reject) {
fs.readFile('./data/a.txt', 'utf8', function (err, data) {//异步任务
if (err) {
reject(err)//失败
} else {
resolve(data)//成功
}
})
})
p1
.then(function (data) {//then方法中的第一个参数function就是容器中的resolve函数
console.log(data)
}, function (err) {//then方法中的第二个参数function就是容器中的reject函数
console.log('读取文件失败了', err)
})
封装Promise版本的readFile
:
var fs = require('fs')
function pReadFile(filePath) {
return new Promise(function (resolve, reject) {
fs.readFile(filePath, 'utf8', function (err, data) {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
}
pReadFile('./data/a.txt')
.then(function (data) {
console.log(data)
return pReadFile('./data/b.txt')
})
.then(function (data) {
console.log(data)
return pReadFile('./data/c.txt')
})
.then(function (data) {
console.log(data)
})
express-session
插件安装:
npm install express-session
配置:
//该插件为req请求对象加上一个成员,:req.session默认是一个对象
//这是最简单的配置方式,暂且不关心里面参数的含义
app.use(session({
secret: 'keyboard cat',//配置加密字符串,在原有加密基础上,加上
//这个字符串,目的是为了安全性提高,防止客户端恶意伪造
resave: false,
saveUninitialized: true//无论你否使用session,默认分给你一把钥匙
}))
使用:
//添加session数据:
req.session.foo = 'bar'
//访问session数据:
req.session.foo
提示:默认session是内存存储的,服务器一旦重启,数据就会丢失,一般的生产环境会对session数据进行持久存储。