node学习大纲3

复习

cookie

  • cookie是在res中设置,req中读取的;第一次的访问没有cookie;
  • cookie的存储大小有限,KV对儿;对用户可见;用户可以禁用或清除cookie;cookie可以被篡改;
  • cookie用来制作记录用户的一些信息;比如购买的历史,猜你喜欢等;
  • http是无状态的协议;所以两次的访问,服务器不能认为是同一个客户端的访问;就要用cookie来巧妙的解决这个问题

session

  • session就是利用cookie实现的会话;就是第一次访问的时候,可以在服务器上为这个用户缓存一些信息;别的用户是不能看到这个用户的信息;服务器会下发一个密钥,我们的客户端每次访问都携带这个密钥;服务器如果发现这个密钥吻合,就能显示这个用户曾经保存的信息;
  • express中session只有在req能有,无论读写都是在req里设置;因为res是用来下发cookie的;但是express语言有些奇怪;他为了统一,把"打点"的语法
  • 登录就是用session来制作的;
var session=require('express-session');
app.use(session({
    ...一些配置;
}));
//express-session的设置和读取都用req对象;
app.get('/',function(req,res){
    console.log(req.session.login)
})
app.get('/login',function(req,res){
    req.session.login=true;
})

加密:使用md5加密

  • 永远不要用明码写密码;目的为了保护用户的隐私;
  • md5加密的特点:
    • md5加密是函数形加密,就是每次加密的结果一定相同,没有随机位;即不管你加密多大的东西,都会加密为32位的字符串,就是密码;
    • 哪怕你更改一个文字,密文都能大变;所以MD5也能用户比对版本;
  • MD5没有反函数破解的可能;但是有人利用穷举算法进行破解;就是把1~99999999所有数字进行加密来进行比对破解;所以对于数据类型的密码,我们都进行两次以上的加密;
  • 作用:我们在存储用户密码的时候,存的是加密过的密码;
    • 以后比对的就是:注册时的md5加密码和登录时的md5加密码;
  • 使用方式:
//1:首先创建hash;
var hash=crypto.createHash('md5');
//2:然后update 和 digest
var password=hash.update('fields.password').digest('base64');
  • 多次加密
const crypto=require('crypto');
console.log(md5(md5('123456').substring(11,7)+md5('123456')))
function md5(mingma){
    var md5=crypto.createHash('md5');
    var password=md5.update(mingma).digest('base64');
    return password;
}

图片处理GraphicsMagick

  • 下载地址:ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/windows/GraphicsMagick-1.3.25-Q16-win32-dll.exe
  • 安装后,通过命令行运行gm;(建议安装到全局);变成全局环境后,删除桌面图标
  • 基本命令的使用:
//格式转换
gm convert a.png a.jpg

//更改当前目录下*.jpg的尺寸大小,并保存于目录.thumb里面
gm mogrify -output-directory .thumbs -resize 320x200 *.jpg
  • nodejs 要使用GraphicsMagick需安装gm的包;
  • 缩小图片的案例;程序一旦运行,图片将被缩小
gm('./a.png')
    .resize(100, 100,'!')
    .noProfile()
    .write('./a2.png', function (err) {
        if (!err) console.log('done');
    });
  • nodejs图像裁切;
gm('./a.png')
    .crop(100,100,100,100)
    .write('./a4.png',function (err) {
        if(!err) console.log('done');
    });
  • 也可以即裁切,也缩小图片

===============

基本操作参考 (http://blog.csdn.net/hsany330/article/details/51970783)[http://blog.csdn.net/hsany330/article/details/51970783]

Mongoose

  • 是一个将javascript对象与数据库产生关系的一个框架;object related model;操作对象,就是操作数据库;
  • mongoose四步走:1) 连接数据库 2)创建类 3)创建实例数据 4)保存实例数据;
    const mongoose=require('mongoose');
    //1:连接数据库- haha是数据库的名字;
    mongoose.connect('mongodb://localhost/haha');
    //2:创建一个类;--相当于创建一个集合;Cat是模型名字
    var Cat=mongoose.model('Cat',{name:String});
    //3:创建一个实例;--相当于创建一个document数据
    var kitty=new Cat({name:'xiaohuamao'});
    //4:把这个实例插入数据库;--只有数据保存成功,才能插入数据库;有数据才能看到数据库
    kitty.save(function (err) {
        if(!err) console.log('保存成功')
    });
    
  • 上面的代码中,没有一个语句是明显的操作数据库,感觉都在创建类,实例化类,调用类的方法;都在操作对象,但是数据库同步持久了;
    所以,mongoose的哲学是通过操作对象来操作数据库;
  • mongoose首先要明白一件事,所有的操作都不会对数据库,而是对类和实例的操作;

mongoose的MVC

  • models
    • db.js 引入数据库
    //目的:mongoose数据库连接
    const mongoose=require('mongoose');
    const db=mongoose.createConnection('mongodb://127.0.0.1:27017/nodejs');
    //监听成功打开数据库;
    db.once('open',function (callback) {
        console.log('数据库成功连接');
    });
    module.exports=db;
    
    • Student.js 创建类模型 和 静态方法
    //目的:创建一个类:
    var mongoose=require('mongoose');
    var db=require('./db');
    //创建一个schema结构;
    var studentSchema=new mongoose.Schema({
        name:{type:String},
        age:{type:Number},
        sex:{type:String}
    });
    //添加静态方法-查找;-就是给类添加静态方法;
    studentSchema.statics.find=function (name,callback) {
        return this.model('Student').find({name},callback)
    };
    //添加静态方法-更新
    studentSchema.statics.update=function (conditions,update,options,callback){
        this.model('Student').update(conditions,update,options,callback)
    };
    
    //创建一个学生类;类是基于shcema创建的;
    var studentModel=db.model('Student',studentSchema);
    //暴露出这个类;
    module.exports=studentModel;
    
  • 前台 app.js 直接实用类和实例;
const Student=require('./models/Student');//只关心模型即可;模型可以使用静态方法,也可以使用实例的方法;
//接下类就是对类和实例的使用;

小项目实战:图书管理系统

  • 路由设计:
//路由设计:
app.get('/',router.showindex)//显示图书
app.get('/addbook',router.addbook);//渲染图书
app.get('/doadd',router.doadd);//添加图书功能;
app.get('/edit',router.showedit)//显示编辑页面
app.get('/doedit',router.doedit)//执行编辑功能;
  • ObjectId的获取方法:var ObjectId=require('mongoose').Types.ObjectId;

mongoose常用的方法

  • 给实例添加方法,用methods;
const dogSchema=new mongoose.Schema({
    name:String,
    type:String
});
dogSchema.methods.zhaotonglei=function (callback) {
    //this指的是实例;
    return this.model('Animal').find({type:this.type},callback)
}
const Animal=db.model('Animal',dogSchema);
  • 使用类的方法和实例的方法;
Animal.findOne({"name":"xiaoguo"},function (err,result) {
    var dog=result;
    dog.zhaotonglei(function (err,result) {
        console.log(result);
    })
})
  • 给类添加静态方法,用statics;
  • 添加索引:
var animalSchema = new Schema({
  name: String,
  type: String,
  tags: { type: [String], index: true } // field level
});

nodejs小总结:

  • nodejs特点:单线程,异步I/O,事件驱动;
  • 适合的程序:就是没有太多计算,I/O比较多的业务;举例:留言本,考试系统,论坛,图片裁切服务器等
  • Nodejs原生模块:http,fs,path,url;静态服务,简单路由;get,post请求;
  • 好用的第三方模块:formidable,gm,express;
  • express:中间件,MVC建站,模版引擎ejs,静态服务,简单路由,get,post请求,md5加密,图片上传等;
  • 服务器的一些概念:Cookie(举例:猜你喜欢,临时存放在客户电脑中;cookie-parser模块),Session(随机的密钥,用express-session模块);
  • mongodb:安装,开机,导入数据,通过shell操作数据库;mongovue可视化工具;nodejs做CRUD(增删改查操作);实战(DA0层封装);索引,操作符$set,$lt,$gt,$push,$pull等
  • mongoose:ODM(把对象和数据库模型绑定在一起,不用直接操作数据库,只需要操作对象,对象自动到数据库中持久);

你可能感兴趣的:(node学习大纲3)