zoukankan      html  css  js  c++  java
  • node.js从入门到菜鸟——node与数据库,一段不得不说的故事

    在前一篇博文中,我们简单的分心了node,用node建立了一个文件解析服务器,并且在服务器中进行了WEB寻址的操作。通过这些操作,我们已经可以把一个简单的静态网站搭设在服务器之上了(http://www.cnblogs.com/xiao-yao/archive/2012/03/30/2425716.html)。

    当然,仅仅完成这样的一个步骤还是远远不够的,我们需要的不是通过node搭设一个静态网站,而是通过node搭设一个完整的应用。那么我们可以想想下一步操作应该做什么了。没错,我们来尝试一下数据库的简单操作。

    在尝试之前,我们需要来学习一个新的模块:querystring模块。

    querystring模块的主要用途是对字符串的处理,我们暂时先学习它的两个方法:

    querystring.stringify(obj, sep='&', eq='=');
    querystring.parse(str, sep='&', eq='=');

    前一个方法是将对象向字符串的处理,后一个方法是将字符串的处理(是不是想到了JSON?)。前一个方法的参数是待处理对象、键值对之间的分隔符号以及键值之间的分割符号;后一个方法的参数与前一个相同,只不过处理的过程是相反的而已。

    好了,我们了解了这个方法之后,便可以进行下一步的工作了。首先是对参数的捕获,前端将数据传递给后台时,后台进行接收并处理,数据的传递似乎就这么简单。

    往往让人莫名痛苦的就是这些简单的东西,比如数据如何传递、node如何处理、如何接收传递过来的参数。好的,我们一个一个来解决。

    首先是数据从前端的传递方式,这个本不该是这里的内容,不过说说也无所谓。前端传递参数有很多方法,比如表单传递、AJAX传递,但归根结底就是两种传递方法,post传递或者get传递。

    两者的区别就是get传递是通过url后面附加参数的传递方法,而post传递是通过表单的数据体附加提交。其他的区别与node无关,这里就不赘述了。

    首先是get方法,通过url传递的参数的获取非常简单,记得前面曾学习过一个url.parse(string).query方法吗?这个方法获取的就是get方法下所传递的参数。

    然后就是对参数的处理了,还记得前面的querystring.parse方法吧,这里我们就可以简单的使用了:

    var name=querystring.parse(url.parse(req.url).query)['name'];

    这样就获取了前端get方法传递的name属性的值了,方法很容易。

    那么post呢?它可不在url中啊。处理post参数,我们需要另一个模块:formidable。

    让我们来看一下formidable的demo吧:

    var formidable = require('formidable'),
        http = require('http'),
        util = require('util');
    http.createServer(function(req, res) {
      if (req.url == '/upload' && req.method.toLowerCase() == 'post') {
        // parse a file upload
        var form = new formidable.IncomingForm();
        form.parse(req, function(err, fields, files) {
          res.writeHead(200, {'content-type': 'text/plain'});
          res.write('received upload:\n\n');
          res.end(util.inspect({fields: fields, files: files}));
        });
        return;
      }
      // show a file upload form
      res.writeHead(200, {'content-type': 'text/html'});
      res.end(
        '<form action="/upload" enctype="multipart/form-data" '+
        'method="post">'+
        '<input type="text" name="title"><br>'+
        '<input type="file" name="upload" multiple="multiple"><br>'+
        '<input type="submit" value="Upload">'+
        '</form>'
      );
    }).listen(8888);

    让我们简单的分析一下这个文件上传:var form = new formidable.IncomingForm();一句通过简单的引用formidable的IncomingForm方法来捕获fields与files的信息,之后使用util模块(以前的sys模块)的inspect方法来返回post对象的结构信息。通过这样的方式获取到post的对象后,便可以对对象进行操作了。

    好了,现在我们分析了两种不同的参数传递以及接收的方式,现在该讲讲如何去对数据库进行操作了。关于数据库我采用的是mongo数据库,这种语法类似JS的NO-SQL数据库无非是前端攻城湿所欣赏的一种数据库了。至于mongo的基本操作我建议参考园内大牛一线码农的8天mongo系列,确实是入门的一部好系列。

    在这里我们先进行做简单的find查找,其他的我们以后再去讨论。

    首先我们先安装并引入mongo模块,具体的行为我们这里不再进行赘述了。对于collection的API是这样写的:

    db.open(function(err, db) {
      if(!err) {
        db.collection('test', function(err, collection) {});
        db.collection('test', {safe:true}, function(err, collection) {});
        db.createCollection('test', function(err, collection) {});
        db.createCollection('test', {safe:true}, function(err, collection) {});
      }
    });

    而find的api则是这样写的:

    find(query[, options][, callback]);

    我们采用最简单的方法来进行一次尝试:

    var db = new mongo.Db("test", new mongo.Server('localhost', 27017, {}), {});
        db.open(function() {
            // 打开名为user的表
            db.collection("user", function(err, collection) {
                // select * from products 相当于db.products.find()
     collection.find({name:querystring.parse(url.parse(req.url).query)['name'],pwd:querystring.parse(url.parse(req.url).query)['pwd']},function(err, cursor) {
                    cursor.toArray(function(err, items) {
                        if (items != null&&items.length != 0) {
                            res.writeHead(200);
                            var obj = {value:1}
                            res.end(JSON.stringify(obj)); 
                        }
                        else{
                            res.writeHead(200);
                            var obj = {value:0}
                            res.end(JSON.stringify(obj));
                        } 
                    });
                });
            });
        });

    OK,我们通过对get方法传递的参数进行提取,并将之与user表中的name与pwd字段进行比较,若有该项则返回1,否则返回0。

    我们已经写好了find方法,但是我不想只有一种数据库操作,所以我需要一个类似路由的方法去寻址。方法如下:

    var mongord = require("./mongord"),    //mongo数据库读取模块
        mongoinsert = require("./mongoinsert"),
        querystring = require("querystring");
    function find_router(req, res){
        if (querystring.parse(url.parse(req.url).query)['num'] == 1) {
            mongord.read_collection(req,res);
        }
        else if(querystring.parse(url.parse(req.url).query)['num'] == 2){
            mongoinsert.insert_collection(req,res);
        }
        else{
    }
    }

    exports.find_router = find_router;

     

    这样,我们就获得了一个近乎路由表的东西,由每次传递参数的value项去判断执行方法。

    最后附上今天的全部代码:

    在上次的文件中加入:

    if (libUrl.parse(req.url).query!=undefined) {
    router.find_router(req,res);
    }

    然后路由表文件名为router:

    var mongord = require("./mongord"),    //mongo数据库读取模块
        querystring = require("querystring");
    function find_router(req, res){
        if (querystring.parse(url.parse(req.url).query)['num'] == 1) {
            mongord.read_collection(req,res);
        }
        else{
        }
    }

    exports.find_router = find_router;

     

    最后是数据库模块,取名为mongord:

    var http = require("http"),
        mongo = require("mongodb"),
        events = require("events"),
        url=require('url'),
        querystring = require("querystring");
    function read_collection(req, res) {
        // 创建到test数据库的链接。相当于use test
        var db = new mongo.Db("test", new mongo.Server('localhost', 27017, {}), {});
        db.open(function() {
            // 打开名为user的表
            db.collection("user", function(err, collection) {
                // select * from products 相当于db.products.find()
                collection.find({name:querystring.parse(url.parse(req.url).query)['name'],pwd:querystring.parse(url.parse(req.url).query)['pwd']},function(err, cursor) {
                    cursor.toArray(function(err, items) {
                        console.log(items);
                        if (items != null&&items.length != 0) {
                            res.writeHead(200);
                            var obj = {value:1}
                            res.end(JSON.stringify(obj)); 
                        }
                        else{
                            res.writeHead(200);
                            var obj = {value:0}
                            res.end(JSON.stringify(obj));
                        } 
                    });
                });
            });
        });
    }
    exports.read_collection = read_collection;

    好的,今天所讲的全部内容就到这里了,希望对于node的新手能有一个较好的帮助,谢谢大家。

    http://www.cnblogs.com/xiao-yao/archive/2012/04/13/2445915.html

  • 相关阅读:
    百度地图V1.5 LocalSearch增加浮动窗体的操作内容
    百度地图LV1.5实践项目开发工具类bmap.util.jsV1.1
    Jquery时间快捷控件(Jtime)配置v1.1
    百度地图LV1.5实践项目开发工具类bmap.util.jsV1.0
    Jquery时间快捷控件(Jtime)配置v1.0
    百度地图JavaScript API V1.5初级开发工具类
    Cocos2d-x可以实现的动画效果
    禁掉Apache web server签名 How to turn off server signature on Apache web server
    codevs 3372 选学霸(hash+并查集+多重背包)
    从头认识Spring-3.4 简单的AOP日志实现-扩展添加检查订单功能,以便记录并检測输入的參数
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2446844.html
Copyright © 2011-2022 走看看