node.js从入门到菜鸟——node与数据库
2015-12-19 11:29
525 查看
在前一篇博文中,我们简单的分心了node,用node建立了一个文件解析服务器,并且在服务器中进行了WEB寻址的操作。通过这些操作,我们已经可以把一个简单的静态网站搭设在服务器之上了(/article/5640483.html)。
当然,仅仅完成这样的一个步骤还是远远不够的,我们需要的不是通过node搭设一个静态网站,而是通过node搭设一个完整的应用。那么我们可以想想下一步操作应该做什么了。没错,我们来尝试一下数据库的简单操作。
在尝试之前,我们需要来学习一个新的模块:querystring模块。
querystring模块的主要用途是对字符串的处理,我们暂时先学习它的两个方法:
前一个方法是将对象向字符串的处理,后一个方法是将字符串的处理(是不是想到了JSON?)。前一个方法的参数是待处理对象、键值对之间的分隔符号以及键值之间的分割符号;后一个方法的参数与前一个相同,只不过处理的过程是相反的而已。
好了,我们了解了这个方法之后,便可以进行下一步的工作了。首先是对参数的捕获,前端将数据传递给后台时,后台进行接收并处理,数据的传递似乎就这么简单。
往往让人莫名痛苦的就是这些简单的东西,比如数据如何传递、node如何处理、如何接收传递过来的参数。好的,我们一个一个来解决。
首先是数据从前端的传递方式,这个本不该是这里的内容,不过说说也无所谓。前端传递参数有很多方法,比如表单传递、AJAX传递,但归根结底就是两种传递方法,post传递或者get传递。
两者的区别就是get传递是通过url后面附加参数的传递方法,而post传递是通过表单的数据体附加提交。其他的区别与node无关,这里就不赘述了。
首先是get方法,通过url传递的参数的获取非常简单,记得前面曾学习过一个url.parse(string).query方法吗?这个方法获取的就是get方法下所传递的参数。
然后就是对参数的处理了,还记得前面的querystring.parse方法吧,这里我们就可以简单的使用了:
这样就获取了前端get方法传递的name属性的值了,方法很容易。
那么post呢?它可不在url中啊。处理post参数,我们需要另一个模块:formidable。
让我们来看一下formidable的demo吧:
让我们简单的分析一下这个文件上传:varform=newformidable.IncomingForm();一句通过简单的引用formidable的IncomingForm方法来捕获fields与files的信息,之后使用util模块(以前的sys模块)的inspect方法来返回post对象的结构信息。通过这样的方式获取到post的对象后,便可以对对象进行操作了。
好了,现在我们分析了两种不同的参数传递以及接收的方式,现在该讲讲如何去对数据库进行操作了。关于数据库我采用的是mongo数据库,这种语法类似JS的NO-SQL数据库无非是前端攻城湿所欣赏的一种数据库了。至于mongo的基本操作我建议参考园内大牛一线码农的8天mongo系列,确实是入门的一部好系列。
在这里我们先进行做简单的find查找,其他的我们以后再去讨论。
首先我们先安装并引入mongo模块,具体的行为我们这里不再进行赘述了。对于collection的API是这样写的:
而find的api则是这样写的:
我们采用最简单的方法来进行一次尝试:
OK,我们通过对get方法传递的参数进行提取,并将之与user表中的name与pwd字段进行比较,若有该项则返回1,否则返回0。
我们已经写好了find方法,但是我不想只有一种数据库操作,所以我需要一个类似路由的方法去寻址。方法如下:
exports.find_router=find_router;
这样,我们就获得了一个近乎路由表的东西,由每次传递参数的value项去判断执行方法。
最后附上今天的全部代码:
在上次的文件中加入:
然后路由表文件名为router:
exports.find_router=find_router;
最后是数据库模块,取名为mongord:
好的,今天所讲的全部内容就到这里了,希望对于node的新手能有一个较好的帮助,谢谢大家。
当然,仅仅完成这样的一个步骤还是远远不够的,我们需要的不是通过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方法吧,这里我们就可以简单的使用了:
varname=querystring.parse(url.parse(req.url).query)['name'];
这样就获取了前端get方法传递的name属性的值了,方法很容易。
那么post呢?它可不在url中啊。处理post参数,我们需要另一个模块:formidable。
让我们来看一下formidable的demo吧:
varformidable=require('formidable'), http=require('http'), util=require('util'); http.createServer(function(req,res){ if(req.url=='/upload'&&req.method.toLowerCase()=='post'){ //parseafileupload varform=newformidable.IncomingForm(); form.parse(req,function(err,fields,files){ res.writeHead(200,{'content-type':'text/plain'}); res.write('receivedupload:\n\n'); res.end(util.inspect({fields:fields,files:files})); }); return; } //showafileuploadform res.writeHead(200,{'content-type':'text/html'}); res.end( '<formaction="/upload"enctype="multipart/form-data"'+ 'method="post">'+ '<inputtype="text"name="title"><br>'+ '<inputtype="file"name="upload"multiple="multiple"><br>'+ '<inputtype="submit"value="Upload">'+ '</form>' ); }).listen(8888);
让我们简单的分析一下这个文件上传:varform=newformidable.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]);
我们采用最简单的方法来进行一次尝试:
vardb=newmongo.Db("test",newmongo.Server('localhost',27017,{}),{}); db.open(function(){ //打开名为user的表 db.collection("user",function(err,collection){ //select*fromproducts相当于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); varobj={value:1} res.end(JSON.stringify(obj)); } else{ res.writeHead(200); varobj={value:0} res.end(JSON.stringify(obj)); } }); }); }); });
OK,我们通过对get方法传递的参数进行提取,并将之与user表中的name与pwd字段进行比较,若有该项则返回1,否则返回0。
我们已经写好了find方法,但是我不想只有一种数据库操作,所以我需要一个类似路由的方法去寻址。方法如下:
varmongord=require("./mongord"),//mongo数据库读取模块 mongoinsert=require("./mongoinsert"), querystring=require("querystring"); functionfind_router(req,res){ if(querystring.parse(url.parse(req.url).query)['num']==1){ mongord.read_collection(req,res); } elseif(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:
varmongord=require("./mongord"),//mongo数据库读取模块
querystring=require("querystring");
functionfind_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:
varhttp=require("http"),
mongo=require("mongodb"),
events=require("events"),
url=require('url'),
querystring=require("querystring");
functionread_collection(req,res){
//创建到test数据库的链接。相当于usetest
vardb=newmongo.Db("test",newmongo.Server('localhost',27017,{}),{});
db.open(function(){
//打开名为user的表
db.collection("user",function(err,collection){
//select*fromproducts相当于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);
varobj={value:1}
res.end(JSON.stringify(obj));
}
else{
res.writeHead(200);
varobj={value:0}
res.end(JSON.stringify(obj));
}
});
});
});
});
}
exports.read_collection=read_collection;
好的,今天所讲的全部内容就到这里了,希望对于node的新手能有一个较好的帮助,谢谢大家。
相关文章推荐
- 13.Benchmark SQL 数据库测试工具代码——事务Stock-Level
- 12.Benchmark SQL 数据库测试工具代码——事务Delivery
- 11.Benchmark SQL 数据库测试工具代码——事务Order-Status
- 10.Benchmark SQL 数据库测试工具代码——事务Payment
- 9.Benchmark SQL 数据库测试工具代码——事务New-Order
- 8.Benchmark SQL 数据库测试工具代码——会话类
- 7.Benchmark SQL 数据库测试工具代码——TPCC主程序
- nodejs中操作mysql数据库示例
- 通过阅读Oracle Enterprise Asset Management User Guide,我对Oracle eAM的初步理解
- 优化SQLServer数据库加快查询速度
- 一次mysql瘫痪解救
- mybatis多数据库动态切换实现
- 连接查询
- 一次mysql瘫痪解救
- PHP memcached使用
- Sqlite常用表查询语句
- 【SQLSERVER学习笔记】进攻式编程
- 6.Benchmark SQL 数据库测试工具代码——执行SQL类
- 5.Benchmark SQL 数据库测试工具代码——关于辅助类
- 4.Benchmark SQL 数据库测试工具代码——关于导入类