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的新手能有一個較好的幫助,謝謝大家。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM