开始nodejs+express的学习+实践(6)

1.express连接mongo

连接mongo,nodejs最接近原始api的模块就是mongodb

在package.json加入依赖,修改后如下:

{
  "name": "application-name",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "express": "~3.4.8",
    "static-favicon": "~1.0.0",
    "morgan": "~1.0.0",
    "cookie-parser": "~1.0.1",
    "body-parser": "~1.0.0",
    "debug": "~0.7.4",
    "ejs": "~0.8.5",
    "formidable": "*",
    "mongodb":"*"
  }
}

我们执行 npm install安装依赖,请耐心等待完成。

我们显示我们已经创建的集合内容。

index.js路由文件,顶部加入:

var mongodb = require("mongodb") ;

请求到了mongodb模块。

我们修改首页路由处理,显示我们的数据:

    app.get('/',function(req, res){
        var server = new mongodb.Server("localhost",27017,{
            auto_reconnect : true
        }) ;
        var conn = new mongodb.Db("blogme",server,{
            safe : true
        }) ;
        conn.open(function(error,db){
            if(error) throw error ;
            db.collection("news",{
                safe : true
            },function(err,collection){
                if(err) throw err ;
                collection.find().toArray(function(e,result){
                    if(e) throw e ;
                    res.render('index', { title: 'Express',hello: 'hello world!',arr: result });
                }) ;
            }) ;
        }) ;
    });

这个几乎是固定写法,这个很好理解吧,数据库在本地,mongo的端口是27017,链接的数据库和blogme

现在变量db就是我们的数据库blogme了。

db代表blogme数据库,我们选择集合news,然后查找,没指定就是查找所有,然后转为数组形式:[{},{},{}]如此形式。。。。。。

我们修改index.html模板页面,用来显示我们的数据库数据:

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
    <p><a href="/hello"><%= hello %></a></p>
    <ul>
        <% for(var i=0; i<arr.length; i++) {%>
        <li><a href="/list"><%= arr[i].title %></a><span><%= arr[i].text %></span></li>
        <% } %>
    </ul>
  </body>
</html>

再循环哪里不会看不懂吧,数据是[{},{},{}]。我们循环数组后arr[index]就是每条数据,我们.下标就是显示记录下字段内容。

运行,我们查看首页内容:

开始nodejs+express的学习+实践(6)_第1张图片

我们看另一种实现方式,mongodb的api很接近mongo的api,用起来比较麻烦,我们使用mongoskin连接数据库。

mongoskin介绍地址:https://github.com/kissjs/node-mongoskin

我们在json加入mongoskin依赖:

{
  "name": "application-name",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "express": "~3.4.8",
    "static-favicon": "~1.0.0",
    "morgan": "~1.0.0",
    "cookie-parser": "~1.0.1",
    "body-parser": "~1.0.0",
    "debug": "~0.7.4",
    "ejs": "~0.8.5",
    "formidable": "*",
    "mongodb":"*",
    "mongoskin":"*"
  }
}

执行npm start 加载完成即可。

我们在index.js路由文件引入mongoskin模块,按照介绍页面给的实例即可:

 var mongo = require('mongoskin');
var db = mongo.db("mongodb://localhost:27017/blogme", {native_parser:true});

稍作修改,连接blogme数据库,我们首页路由修改:

    app.get('/',function(req, res){
        db.bind('news');
        db.news.find().toArray(function(err, items) {
            if (err) throw err;
            res.render('index', { title: 'Express',hello: 'hello world!',arr: items });
            db.close();
        });
    });

找到集合,然后对集合操作输出,对比我们的mongodb使用,代码简洁的多得多。

我们预览效果同使用mongodb一样,此时删除mongodb模块的引入。

2.数据模型的分离

我们的index.js作为路由处理,在mvc是c处理,我们在这个文件里请求数据库和显示数据代码放在一起让程序显得很混乱,我们如同在app.js把路由拿出一样,把数据的访问也拿出去,在路由页面只接受到数据就可以了。

我们blogme目录创建 model文件夹,下面创建model.js文件

开始nodejs+express的学习+实践(6)_第2张图片

model和router等同级。

我们开始编辑model.js文件,用来返回数据:

var mongo = require('mongoskin');
var db = mongo.db("mongodb://localhost:27017/blogme", {native_parser:true});
function model_index(callback){
    db.bind('news');
    db.news.find().toArray(function(err, items) {
        if (err) throw err;
        callback(items);
        db.close();
    });
};
exports.model_index=model_index;

在这个页面,我们会打开数据库,将数据返回到回调中,我们修改index.js路由,

我们先要获取model.js文件:

var model = require('../model/model');

首页路由修改:

    app.get('/',function(req, res){
        model.model_index(function(items){
            res.render('index', { title: 'Express',hello: 'hello world!',arr: items });
        });
    });

调用model的方法,定义回调处理,我们运行,发现同以前。

我们在model.js里面对数据库有很多链接信息,model.js随后会不断加入返回数据处理,代码会不断增多,还有就是数据库名称这些信息有时候要修改的,为了方便,我们把这些提出,在model目录下创建config.js存放这个数据局连接信息:

var connect="mongodb://localhost:27017/blogme";
exports.connect=connect;

model.js修改:

var config = require('./config');
var mongo = require('mongoskin');
var db = mongo.db(config.connect, {native_parser:true});
function model_index(callback){
    db.bind('news');
    db.news.find().toArray(function(err, items) {
        if (err) throw err;
        callback(items);
        db.close();
    });
};
exports.model_index=model_index;

运行,预览。

我们在model.js这次加peoples集合的返回,显示在/hello页面里:

model.js加入代码:

var config = require('./config');
var mongo = require('mongoskin');
var db = mongo.db(config.connect, {native_parser:true});
function model_index(callback){
    db.bind('news');
    db.news.find().toArray(function(err, items) {
        if (err) throw err;
        callback(items);
        db.close();
    });
};
function model_hello(callback){
    db.bind('peoples');
    db.peoples.find().toArray(function(err, items) {
        if (err) throw err;
        callback(items);
        db.close();
    });
};
exports.model_index=model_index;
exports.model_hello=model_hello;

路由index.js对/hello做修改显示:

    app.get('/hello',  function(req, res){
        model.model_hello(function(items){
            res.render('hello', { arr: items });
        });
    });

模板hello.html修改:

<!DOCTYPE html>
<html>
  <head>
    <title>hello</title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
  <ul>
      <% for(var i=0; i<arr.length; i++) {%>
      <li><span><%= arr[i].name %></span></li>
      <% } %>
  </ul>
  </body>
</html>

运行,预览首页:

开始nodejs+express的学习+实践(6)_第3张图片

点击进入hello页面:

开始nodejs+express的学习+实践(6)_第4张图片

与数据库集合相符,我们回头看model.js

开始nodejs+express的学习+实践(6)_第5张图片

每次加入数据处理都要定义一次,很是麻烦,我们修改模式,采用单例处理:

var config = require('./config');
var mongo = require('mongoskin');
var db = mongo.db(config.connect, {native_parser:true});
var model={};
model.model_index=function(callback){
    db.bind('news');
    db.news.find().toArray(function(err, items) {
        if (err) throw err;
        callback(items);
        db.close();
    });
};
model.model_hello=function(callback){
    db.bind('peoples');
    db.peoples.find().toArray(function(err, items) {
        if (err) throw err;
        callback(items);
        db.close();
    });
};
module.exports=model;

我们每次只要挂在model对象下就可以了。

写在expores和module.exports下的区别可以百度查看,exports是module的一个属性。

总结:

首先使用了mongodb模块的数据显示;

接下来采用了mongoskin模块;

index.js代码:修改,引入model模块和处理

var formidable = require('formidable');
var fs = require('fs');
var crypto = require('crypto');
var model = require('../model/model');
function rout(app){
    app.get('/',function(req, res){
        model.model_index(function(items){
            res.render('index', { title: 'Express',hello: 'hello world!',arr: items });
        });
    });
    app.get('/hello',  function(req, res){
        model.model_hello(function(items){
            res.render('hello', { arr: items });
        });
    });
    app.get('/list',  function(req, res){
        res.render('list', { text: req.query.id });
    });
    app.get('/login',  function(req, res){
        res.render('login');
    });
    app.post('/logincheck',  function(req, res){
       var user= req.body.user;
       var pass= req.body.pass;
        if(user=="tom" && pass=="tom"){
            res.redirect('/');
        }else{
            res.redirect('/login');
        };
    });
    app.get('/file',  function(req, res){
        res.render('file');
    });
    app.post('/upfile',  function(req, res){
       //code
        var form = new formidable.IncomingForm();
        form.uploadDir = "./upload";
        form.parse(req, function(err, fields, files) {
            if (err) {
                res.redirect('/file');
            }
            var tmp_path, target_path;
            if (files.file.size > 0) { //表示有文件上传
                tmp_path = files.file.path;//内存中的文件,当前文件目录
                var picType =  files.file.name.split(".")[1];//后缀名
                //移动目的目录
                target_path = './public/images/pic_1.' + picType;
                //同步方式移动文件
                fs.renameSync(tmp_path, target_path);
            }else{
                res.redirect('/file');
            };
        });
    });
    app.get('/fs',  function(req, res){
        fs.writeFile('./fs/me/1.txt', 'read me','utf8',
            function (err) {
                if (err) throw err;
            });
    });
    app.get('/crypto',  function(req, res){
        var pass="admin";
        var md5 = crypto.createHash('md5');
        var mpass=md5.update(pass).digest('hex');
        var rmpass=mpass.substring(2);
        res.render('crypto', { res:pass,resm:mpass,resrm:rmpass });
    });
    app.get('/globals',  function(req, res){
        res.render('globals', { res:__dirname+":"+__filename });
    });
};
exports.rout=rout;

model.js 新增在model目录下

var config = require('./config');
var mongo = require('mongoskin');
var db = mongo.db(config.connect, {native_parser:true});
var model={};
model.model_index=function(callback){
    db.bind('news');
    db.news.find().toArray(function(err, items) {
        if (err) throw err;
        callback(items);
        db.close();
    });
};
model.model_hello=function(callback){
    db.bind('peoples');
    db.peoples.find().toArray(function(err, items) {
        if (err) throw err;
        callback(items);
        db.close();
    });
};
module.exports=model;

config.js

var connect="mongodb://localhost:27017/blogme";
exports.connect=connect;

index.html 修改显示数据库内容

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
    <p><a href="/hello"><%= hello %></a></p>
    <ul>
        <% for(var i=0; i<arr.length; i++) {%>
        <li><a href="/list"><%= arr[i].title %></a><span><%= arr[i].text %></span></li>
        <% } %>
    </ul>
  </body>
</html>

hello.html

<!DOCTYPE html>
<html>
  <head>
    <title>hello</title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
  <ul>
      <% for(var i=0; i<arr.length; i++) {%>
      <li><span><%= arr[i].name %></span></li>
      <% } %>
  </ul>
  </body>
</html>

你可能感兴趣的:(开始nodejs+express的学习+实践(6))