上集回顾
上一节中,我们已经通过表单验证得到了clean data(有效、安全的用户数据),下一步便是存储这些信息。
只有在注册时保存了用户信息,才可能在登录时进行用户验证;而直接存储在内存中(例如存储在全局变量中),一则重启断电后就会丢失,二则内存难以承受大量的存储。于是,我们需要实现数据的持久性。
持久数据存在于应用程序的活动内存之外,通常在数据库或文件系统中。 只有这样才能应对服务器重启、服务器迁移等情况。
当然,实现数据持久性最简单的方式便是存储文件,在Node中使用fs模块进行读写。然而对于web应用而言,文件存储存在以下的问题:读写性能。使用文件存储应用数据,每次数据更新都需要读取并写入整个文件。而web应用中每次数据存储量都很少(我们的例子中,只存储用户名、密码),但很频繁(会有很多的用户操作)。
并发问题。文件存储的特点,使得并发访问产生数据一致性问题。以售票系统为例,当一个用户正在购票时,如果允许另一个用户参与购票,则会有两次结果的写入,最终票数只减一。当然可以禁止并发的存在,那么系统的吞吐量和友好度都会大打折扣。
数据库则为这类的数据存储提供了更好的解决方案,一般数据库都会支持并发控制、数据备份、多应用共享、建立索引等功能。这一节中,我们将用Express Web应用来连接一个数据库,进行数据存储与查询。
/***************************************以上来自互联网**************************/
缘起mongodb
MongoDB是一种面向文档的数据库管理系统,由C++撰写而成。与传统关系型数据库相比有几个重要的特点:
面向文档(Document-Oriented)的存储。JSON风格的文档还可以定义动态的模式(Schema),提供了很大程度的自由。
Javascript语法的CRUD(create、retrieve、update、delete)。支持按字段、范围、甚至正则表达式的查询。
在这里可以下载到最新的MongoDB,选择适合你的平台的安装文件,并进行安装。
如何启动:
> 这里只会介绍windows系统的mongodb服务器启动。
下载完毕后将执行目录切换到根目录下的bin文件夹下:
/************ 笔者是下载放到E盘根目录下 **********************/
cd e:
cd mongodb/bin
ok 如果你已经成功执行完上一步现在紧接着下一步:
/************* 如果没有test这个文件夹则会重新创建一个 **********/
mongod --dbpath ../test/
现在如果你的命令行已经有一打命令敲出来,并且如果成功显示连接到 连接信息 与
端口尚待连接,则大功告成了。
更方便的mongoose
我们不打算直接使用mongdb操作数据库,因为这就好像用原生javascript操作DOM一般,
我们使用mongoose.
还记得吗?我们的Web应用采用的是Express框架,那么如何在Express中连接MongoDB呢?为了更简单地完成这个操作,我们引入Node.js的MongoDB对象建模工具Mongoose。
首先,我们来下载mongoose并将其引入到我们项目的依赖(package.json的depen dences字段)中。
# 在项目根路径中执行npm install
# save参数将会把该依赖自动写入到package.json中。
npm install mongoose --save
加入测试案例
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var Cat = mongoose.model('Cat', { name: String });
var kitty = new Cat({ name: 'Zildjian' });
kitty.save(function (err) {
if (err) // ...
console.log('meow');
});
/* 以上内容写在app.js 最后面即可 **/
我们做了什么???
我们首先引入了mongoose这个模块,然后连接到test数据库,如果这个数据库没有则创建之。
然后我们还创建了一个名为Cat的模型model并规定了属性name为String 。
模型是什么呢?
模型可以看作mysql中的数据表,属性可以看作是字段,当然这个类比并不十分正确。
anyway, 然后我们又创建了Cat的一个实体kitty,并保存之。
如果成功保存你可以在之前的mongodb服务器命令行中看到保存的信息。
开始投入生产吧
创建用户模型
常见的做法如下:
模型即MVC框架中的Model,我们创建单独的模型文件夹models来存放我们的模型,并且创建一个定义用户模型的文件user.js,如下:
models/user.js
/**********************models建立在项目根目录即可 *****************/
>user.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
username: {type: String, index: {unique: true}},
password: String,
avatar: {
type: String,
default: '/images/default-avatar.jpeg'
},
title: {
type: String,
default: '未命名博客'
},
description: {
type: String,
default: '博主很懒,还没有添加任何描述……'
}
});
module.exports = mongoose.model('User', UserSchema);
我们做了什么????
关于mongoose的具体内涵并不会涉及
我们只是单纯的建立了类似mysql的数据表框架,然后我们可以往里面填我们的数据,然后导出这个模型名为User.
之后通俗的用法是类似如下的写法:
User.create({username: username, password: password},
function(err, user) {
if (err) return next(err); // 交给接下来的错误处理中间件
res.status(201).end('注册成功'); // 存储成功
});
存储注册用户
var User = require('../models/user');
// 接受用户表单
router.post(function(req, res, next) {
var username = req.body.username || '',
password = req.body.password || '';
if (username.length === 0 || password.length === 0) {
return res.status(400).end('用户名或密码不合法');
}
User.create({username: username, password: password},
function(err, user) {
if (err) return next(err); // 交给接下来的错误处理中间件
res.status(201).end('注册成功'); // 存储成功
});
});
##### 我们做了什么????
我们引入之前的User模型然后在注册表单上做了下简单验证并提取用户名及密码然后保存一个user对象。
如果成功保存的话可以在数据库看到相关的讯息或者使用数据可视化软件查看。
作者:颜卿今天Coding了吗
链接:http://www.jianshu.com/p/915c547c7abc
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。