《Node.js实战》读书笔记一

237 阅读4分钟

一、模板引擎

一个将页面模块和要显示的数据结合起来生成HTML页面的工具,相当于MVC找那个的视图V。ejs模板引擎与express集成良好。

app.set('views', path.join(__dirname, 'views'))//设置了模板文件的存储位置
app.set('view engine', 'ejs')// 设置使用ejs模板引擎

二、使用数据库 MongoDB

1、MongoDB

MongoDB是一个基于分布式文件存储的非关系型数据库(NoSQL),旨在为web提供可扩展高性能数据存储方案,支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。

MongoDB 有文档集合的概念:

  • 文档是MongoDB最基本的单位,每个文档都会以唯一的_id标识,文档的属性为key/value的键值对形式,文档可以嵌套另一个文档;
  • 集合是文档的总和,一个数据库有多个集合。
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "title" : "MongoDB 教程",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
}

2、Mongoose

Mongoose是MongoDB数据库的模型工具,为Node.js设计,使用Mongoose可简化不少代码。

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/blog');

var userSchema = new mongoose.Schema({
  name: String,
  password: String,
  email: String,
  head: String
}, {
  collection: 'users' 
});

var userModel = mongoose.model('User', userSchema);

function User(user) {
  this.name = user.name;
  this.password = user.password;
  this.email = user.email;
};

User.prototype.save = function(callback) {
 var user = {
      name: this.name,
      password: this.password,
      email: this.email,
  };
  var newUser = new userModel(user);

  newUser.save(function (err, user) {
    if (err) {
      return callback(err);
    }
    callback(null, user);
  });
}

三、Redis

对于高并发数据量小的服务,使用Node.js和Redis绝对是一个不二的选择,它们都是单线程模式,异步非堵塞I/O。

1、Redis概念

一个支持网络、可基于内存也可持久化的日志型、key-value数据库。

2、特点

  • 存储的是一个个key-value键值对;
  • 内存数据库;存储在磁盘即持久化;
  • 五种数据类型(string字符串、hash哈希、list链表、set无序集合、zset有序集合)

3、数据类型

  • string字符串:基本数据类型;
  • hash哈希:字符串类型的字段和字段值的映射表,适合存储对象;
  • list链表:存储一个有序的字符串列表,内部是使用双向链表实现;通常用链表实现栈和队列;
  • set集合:唯一的,无序的,可以进行交并差的操作。 Redis的hash、list、set、zset都不支持数据类型的嵌套。

4、基本使用

通用
  • KEYS*:返回Redis中所有的键;
  • Redis命令不区分大小写;
  • 数字值在Redis中以字符串的形式保存;
字符串
  • SET key value:设置key的值为value;
  • GET key:获取key的值;
  • INCR key:key的值加1(若key不存在则设key初值为0且自增1,若key值不为整数时会提示错误)
哈希
  • HSET key field value:设置key(对象)的field字段值为value;
  • HGET key field:获取key(对象)的field字段的值;
  • HGETALL key:获取key中所有的字段和其值;
链表类型

适合存储如社交网站的新鲜事,假如有几千万条,但获取头部或尾部的10条记录也是极快的。

  • LPUSH key value/[value...]:往key链表左边添加元素;
  • RPUSH key value/[value...]:往key链表右边添加元素;
  • LPOP key :移除key链表左边第一个元素;
  • RPOP key :移除key链表右边第一个元素;
  • LRANGE key start stop:获取链表中某一个片段;-1表示最后一个元素;
集合类型
  • SADD key number/[number...]:向集合添加一个或多个元素,若添加的元素集合已存在,则忽略这个元素;
  • SREM key number/[number...]:向集合删除一个或多个元素;
  • SMEMBERS key:返回集合中所有元素;
  • SINTER key/[key...]:多个集合执行交集运算;
  • SDIFF key/[key...]:多个集合执行差集运算;
  • SUNION key/[key...]:多个集合执行并集运算;
有序集合类型

有序集合中每个元素都关联了一个分数,通过分数指定分数范围内的元素等与分数有关的操作;

  • ZADD key score number/[sorce number...]:向有序集合添加一个或多个元素和该元素对应的值,若添加的元素集合已存在,则用新的分数替换原来的分数;
  • ZREM key number/[number]:向集合删除一个或多个元素;
  • ZRANGE key start stop[WITHSCORES]:按元素分数从小到大顺序返回从start到stop之间所有的元素;如果需要同时获得元素分数的话,在尾部加上WITHSCORES参数;如果两个元素分数相同,则按照元素字典顺序排列;
  • ZREVRANGE key start stop[WITHSCORES]:同上,按元素分数从大到小顺序;