Nodejs + MongoDb

1、搭建开发环境css

进入 http://nodejs.org 下载开发环境html

http://Expressjs.com 下载安装Express  npm install -g expressjava

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------node

MongoDB对许多平台都提供驱动能够访问数据库,如C#、Java、Node.js等。这里以Node.js为例。mongodb

安装MongoDB访问驱动
使用包管理器,在命令行执行以下指令:数据库

全局安装驱动express

npm install mongodb -gnpm

在当前项目中引入mongodb设计模式

npm install mongodb --saveapp

 

在项目的根目录下新建一个db.js文件,使用Node.js操做MongoDB

添加数据

//引入mongodb模块,得到客户端对象
var MongoClient = require('mongodb').MongoClient;
//链接字符串
var DB_CONN_STR = 'mongodb://localhost:27017/gomall';    

//定义函数表达式,用于操做数据库并返回结果
var insertData = function(db, callback) {  
    //得到指定的集合 
    var collection = db.collection('users');
    //插入数据
    var data = [{_id:7,"name":'rose',"age":21},{_id:8,"name":'mark',"age":22}];
    collection.insert(data, function(err, result) { 
        //若是存在错误
        if(err)
        {
            console.log('Error:'+ err);
            return;
        } 
        //调用传入的回调方法,将操做结果返回
        callback(result);
    });
}

//使用客户端链接数据,并指定完成时的回调方法
MongoClient.connect(DB_CONN_STR, function(err, db) {
    console.log("链接成功!");
    //执行插入数据操做,调用自定义方法
    insertData(db, function(result) {
        //显示结果
        console.log(result);
        //关闭数据库
        db.close();
    });
});

运行结果:

链接成功!
{ result: { ok: 1, n: 2 },
  ops: 
   [ { _id: 7, name: 'rose', age: 21 },
     { _id: 8, name: 'mark', age: 22 } ],
  insertedCount: 2,
  insertedIds: [ 7, 8 ] }

修改数据

//引入mongodb模块,得到客户端对象
var MongoClient = require('mongodb').MongoClient;
//链接字符串
var DB_CONN_STR = 'mongodb://localhost:27017/gomall';    

//定义函数表达式,用于操做数据库并返回结果
var updateData = function(db, callback) {  
    //得到指定的集合 
    var collection = db.collection('users');
    //要修改数据的条件,>=10岁的用户
    var  where={age:{"$gte":10}};
    //要修改的结果
    var set={$set:{age:95}};
    collection.updateMany(where,set, function(err, result) { 
        //若是存在错误
        if(err)
        {
            console.log('Error:'+ err);
            return;
        } 
        //调用传入的回调方法,将操做结果返回
        callback(result);
    });
}

//使用客户端链接数据,并指定完成时的回调方法
MongoClient.connect(DB_CONN_STR, function(err, db) {
    console.log("链接成功!");
    //执行插入数据操做,调用自定义方法
    updateData(db, function(result) {
        //显示结果
        console.log(result);
        //关闭数据库
        db.close();
    });
});

运行结果:

链接成功!
{ result: { n: 5, nModified: 5, ok: 1 }

查询数据

//引入mongodb模块,得到客户端对象
var MongoClient = require('mongodb').MongoClient;
//链接字符串
var DB_CONN_STR = 'mongodb://localhost:27017/gomall';    

//定义函数表达式,用于操做数据库并返回结果
var findData = function(db, callback) {  
    //得到指定的集合 
    var collection = db.collection('users');
    //要查询数据的条件,<=10岁的用户
    var  where={age:{"$lte":10}};
    //要显示的字段
    var set={name:1,age:1};
    collection.find(where,set).toArray(function(err, result) { 
        //若是存在错误
        if(err)
        {
            console.log('Error:'+ err);
            return;
        } 
        //调用传入的回调方法,将操做结果返回
        callback(result);
    });
}

//使用客户端链接数据,并指定完成时的回调方法
MongoClient.connect(DB_CONN_STR, function(err, db) {
    console.log("链接成功!");
    //执行插入数据操做,调用自定义方法
    findData(db, function(result) {
        //显示结果
        console.log(result);
        //关闭数据库
        db.close();
    });
});

运行结果:

链接成功!
[ { _id: 0, name: 'zhangguo0', age: 8 },
  { _id: 1, name: 'zhangguo1', age: 9 } ]

删除数据

//引入mongodb模块,得到客户端对象
var MongoClient = require('mongodb').MongoClient;
//链接字符串
var DB_CONN_STR = 'mongodb://localhost:27017/gomall';    

//定义函数表达式,用于操做数据库并返回结果
var findData = function(db, callback) {  
    //得到指定的集合 
    var collection = db.collection('users');
    //要删除数据的条件,_id>2的用户删除
    var  where={_id:{"$gt":2}};
    collection.remove(where,function(err, result) { 
        //若是存在错误
        if(err)
        {
            console.log('Error:'+ err);
            return;
        } 
        //调用传入的回调方法,将操做结果返回
        callback(result);
    });
}

//使用客户端链接数据,并指定完成时的回调方法
MongoClient.connect(DB_CONN_STR, function(err, db) {
    console.log("链接成功!");
    //执行插入数据操做,调用自定义方法
    findData(db, function(result) {
        //显示结果
        console.log(result);
        //关闭数据库
        db.close();
    });
});

运行结果:

链接成功!
{ result: { n: 4, ok: 1 },

http://www.cnblogs.com/best/p/6212807.html

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

继续安装ejs:npm install ejs

若是要想运行Node.js程序,则如今只可以使用“node app.js”,而这样的运行方式,若是在app.js文件修改以后每每须要从新启动才能够加载新的内容,这对于开发是很是不方便的, 为此,可使用一个supervisor组件包,它能够动态的加载修改以后的开发程序。

下载安装supervisor

npm install -g supervisor

利用supervisor方式运行程序

supervisor app.js

2、代码开发

 使用EJS模板

全部用户须要保存的页面都应该保存在views目录下,可是此时index.ejs是一个html页面,而有的人不习惯于使用ejs,习惯于使用html,为了解决这样的问题,则须要配置模板。

         定义加载的项目模块

var ejs = require('ejs') ; // require()函数表示要加载的模块

         须要增长一些相关的配置;

app.engine('html',ejs.__express) ;

app.set('view engine', 'html'); // 替换:app.set('view engine', 'ejs');

         将views中的index.ejs文件修改成index.html文件,观察是否能够改变。

         下面编写一个用户的登陆,登陆的时候只提供用户id(userid)和密码,下面创建几个相关的操做页面:login.html、welcome.html。可是在创建这两个文件的时候,请必定要注意,文件的编码必须设置为UTF-8,不然没法操做中文。

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
   <h1><%= title %></h1>
<form method="post">
    用户ID:<input type="text" name="userid" id="userid"><br>&nbsp;&nbsp;码:<input type="password" name="password" id="password"><br>
    <input type="submit" value="登陆">
    <input type="reset" value="重置">
</form>
</body>
</html>
login.html
<!DOCTYPE html>
<html>
  <head>
    <title>Welcome</title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1>欢迎<%=user.userid%>光临!</h1>
    <h1><a href="logout">注销</a></h1>
  </body>
</html>
welcome.html
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p><a href="login">用户登陆</a></p>    
  </body>
</html>
index.html

在每个页面之中并无定义直接的链接,由于Node.js依然属于MVC设计模式的范畴,因此针对于MVC的实现,此处所编写的所有都属于映射名称,全部的映射路径都须要经过app.js进行相应的路由配置。

 3、设计路由功能

 

 

app.get('/', routes.index);

app.get('/login', routes.login);         // 此处还须要routes/index.js修改

app.post('/login', routes.doLogin);  // 处理post请求,表单提交

app.get('/logout', routes.logout);     // 处理注销

app.get('/welcome', routes.welcome);                // 进入到首页

 

         而这5 个操做路径配置完成以后,还须要找到routes/index.js文件进行相关的回调函数的配置操做。

范例:修改index.js文件

/*
 * GET home page.
 */

exports.index = function(req, res){
  res.render('index', { title: 'Express' });
};
exports.login = function(req, res){
  res.render('login', { title: '用户登陆' });
};
exports.doLogin = function(req, res){
    var user = {userid:'mldnadmin' , password:'hellojava'} ;    // 固定数据
    // 若是要想接收请求,经过req对象
    if (req.body.userid==user.userid && req.body.password==user.password) {
        res.redirect("/welcome?uid=" + req.body.userid) ;    // 地址重写
    }
    res.redirect("/login") ;
};
exports.logout = function(req, res){
  res.render('login', { title: '用户注销' });
};
exports.welcome = function(req, res){
    // 若是是地址栏参数使用req.query.参数名称接收
    var user = {
        userid : req.query.uid     }
  res.render('welcome', { title: '程序首页' , user:user });
};
index.js

那么在整个的基础过程之中,最为重要的步骤就配置app.js中的路由,固然,路由的最终控制是经过index.js文件完成的,在这个文件就至关于Java中的Servlet功能,负责跳转。

4、利用MongoDB来解决数据库的登陆问题

下载MongoDB:http://www.mongodb.org/

之后使用mongodb暂时将其定义为在d盘上,因此如今须要在d盘上创建一个data/db的文件目录。

         随后打开一个新的命令行窗口,让路径设置在d盘路径下,首先启动mongodb服务:mongod.exe;

 

Wed Aug 14 16:13:19.739 [initandlisten] MongoDB starting : pid=4344 port=27017 dbpath=\data\db\ 32-bit host=cab34d4eb860431

Mongodb服务启动以后,下面也一样须要打开一个新的命令行窗口,使用mongo进行操做。

打开命令行窗口输入:mongo.exe命令,启动mongodb的命令窗口。

范例:建立一个新的数据库(mongodb里没有数据库):

use mldndb

范例:设置一个users文档

db.users.insert({userid:'mldn',name:'lixinghua',password:'hello'}) ;

db.users.insert({userid:'mldnjava',name:'mole',password:'nodejs'}) ;

         此时能够经过show tables查看全部的集合,已经发现存在了users集合。下面查询所有:

db.users.find();

         此处为了方便,因此全部的密码并无采用加密的处理方式。

         但是若是如今直接利用node.js提供的mongodb操做不方便使用。

 

因此在处理mongodb的时候建议使用express-mongoose组件。

npm install express-mongoose

         此组件能够和express组件完美的搭档。

下载一个mongoose的组件。:npm install mongoose

实现数据库验证

当mongodb配置完成以后,下面就首先须要定义一个与Users集合有关的新的组件。相似于VO类的概念,只不过如今这个类须要经过*.js文档描述,在routes目录下建立models.js文件。

var mongoose = require('mongoose') ;    // 定义使用组件
var Schema = mongoose.Schema ;    // 建立模式
var UserSchema = new Schema({
    userid : String ,
    name : String ,
    password : String
}) ;    // 定义了一个新的模式,可是此模式还未和users集合有关联
exports.User = mongoose.model('User',UserSchema) ;    // 与Users表关联
建立models.js文件

范例:修改index.js文件,使用新的组件模块

var mongoose = require('mongoose') ;     // 导入组件

var models = require('./models') ;   // 导入自定义组件

var User = models.User ;       // 使用User模型,对应的users表

mongoose.connect('mongodb://localhost/mldndb') ;  // 链接数据库

         如今最须要改变的就是doLogin操做,由于此处须要使用数据库验证。

         若是要想完成登陆验证,只须要根据用户名和密码取得数据量便可。

db.users.count({userid:'mldn',password:'hello'}) ;

         只须要根据返回的数量就能够肯定用户名和密码是否正确。

exports.doLogin = function(req, res){

         // 如今拼凑出了一个基本的字符串

         var query_doc = {userid:req.body.userid , password:req.body.password} ;    // 固定数据

         User.count(query_doc,function(err,doc){// 直接利用mongodb的命令进行操做

                   if(doc == 0) {      // 输入错误,没有此信息

                            res.redirect("/login") ;

                   } else {       // 成功

                            res.redirect("/welcome?uid=" + req.body.userid) ;     // 地址重写

                   }

         }) ;

};

         并且最为关键的是整个过程之中,再也不去考虑数据库的关闭问题,极大的方便了用户开发。

相关文章
相关标签/搜索