node初探(很全的hello world工程)

1、使用node的简单体会
        这两天稍微学了一下node,体会了一下传说中的异步编程语言,然后写了个简单的小demo。
        node给我的感觉首先是短小精悍,开启一个服务器竟然只需要短短的几行代码,使用现成的框架(我把node里面提供的模块理解为框架)也只需要几行代码,连配置文件都不要。
        其次,在node里面使用数据库太方便了,从mysql数据库中取出来的数据直接就是object,而且node对于json格式的数据有很好的支持。
        至于node的其他的好处和不足,我想只有经过很多的实战才能真正的理解吧。
2、使用Idea,将node和mongodb结合实现一个拥有增删该查的小Demo
        2.1  在动手之前还是得先学几个知识点。
                2.1.1 异步编程
                        在说异步之前,先看看什么是非异步。如果你用过java socket,那么就很容易理解了,我们会在服务器端以阻塞的方式等待
                一个s ocket的连接,看如下代码,只有在服务器的accept函数收到一个socket连接的时候,才会去执行之后的代码,否则的话什么
                也不 会去做。  而如果是异步的方式,在没有收到socket连接的时候它也能执行后面的代码。
                        我前几天看过一本书上讲过其实异步才是人们生活中常用的逻辑,因为你不可能因为等一个快递然后就一天都处于等的状态,
                你也不可能因为在上课的时候等下课却不玩手机。异步提高了人们的生活效率,也提高了程序的运行效率,但是因为非异步的思维
                帮助我们更容易的写出代码,所以以前的语言大多都是非异步的。
                        (异步的概念其实很简单,但是一旦用起来就会很不习惯)

while(true){
  Socket socket=null;
  try{
    socket=serverSocket.accept();
  }catch(IOException e){
    e.printStackTrace();
  }finally{
//其他操作
  }
//其他操作
}

                2.2.2 node.js的回调机制
                        在了解了异步以后,你也许会有一个疑问,如果代码不是按照顺序执行下来,那么我那种必须要等到之前的代码执行完才能
                继续执行的代码怎么办呢?没关系,node.js里有神奇的回调机制。回调,简单的讲,就是将B函数作为参数传递给A函数,然后在
                A函数执行完之后B函数就会被执行。具体的可以看下 http://www.jb51.net/article/51916.htm这篇文章,我觉得讲的很清楚。
                2.2.3 简单聊聊mongodb
                        这是我第一次使用传说中的nosql数据库,使用的不多,真的只能说是初探。感觉mongodb就是将一大堆的json格式的数据
                存储在了文件里面,然后提供很多有用的api供操作。我用的时候感觉少了很多的束缚,不用担心这里那里的typeerror,也不用担心
                这里那里的null。但是少了束缚真的好吗?使用nosql数据库是不是对代码有更高的要求?
                        再说说mongodb的安装和使用吧,因为我第一次用的时候还遇到了点麻烦。
                        下载,安装,安装的时候有个选项可以选择安装路径,一定要记住,我选的是D:\mongodb,装完之后在看看安装路径下面,
                多了bin目录和其他几个文件,我们在安装目录下新建一个data文件夹,然后在data文件夹里面新建一个db文件夹,以后我的数据
                就会放在这个db文件里面。然后打开bin文件夹,里面有很多的exe文件,有两个很常用的exe,mongo.exe和mongod.exe,不过
                不能直接双击打开,我们得从cmd里面运行。从cmd里面cd到bin目录下面,运行
mongod --dbpath db文件夹的路径(比如我的 mongod --dbpath D:\mongodb\data\db)
                如果出现下面的界面,那么就和mongodb连接成功了。
然后再打开一个cmd,同样进到bin目录下面输入mongo,回车,出现:
这样就进到我们的mongodb里面了,然后就可以使用命令行创建数据库、集合等等。
                    2.2.4使用idea建立node工程
                            当然,首先你得安装好node,怎么安装请自行百度吧
                            idea是个很好的编辑器,它也提供了对node.js的支持,不过得自己装一个插件。
                    打开idea,进到file-settings-plugin里面,搜索node,然后安装(下面我的截图是已经装好了的)。
                            安装完之后重启就能创建node工程了。进到file-new-project
                            新建好的工程目录如下:
                            上面的目录里面有个app.js,我们把它作为我们的程序的入口,就相当于java里面的main函数所在的类文件。
                    views目录:存放页面的文件夹,里面有几个已经存在的jade文件,这个之后再说。
                    routes目录:里面存放的路由文件,相当于mvc框架里面的controller,用来控制页面的跳转。
                    node_modules目录:里面有很多的文件夹,每一个都是一个模块,一个模块就好比是java里的一个框架 ,比如spring框架,比如
              hibernate框架,我们只需要很简单的代码就能使用这些框架,而且不需要任何的配置文件。(或许理解成jar包更合适一点,一个模
                块就是一个jar包,里面有很多的函数、类可以使用,不过框架本质上不也是一堆的jar包吗)
                    public目录:这个我还没用到过。。。。。
                    datasource:不用想,这个肯定是和数据库相关的目录了。
                
                2.3  编写demo        
                        既然是网站,服务器当然是不能少的,我们在app.js里面加一段代码,总之就是通过这段代码就能建立服务器,至于原理我现在
                不懂。
var server = app.listen(8081,function(req,res){
var host = server.address().address;
var port = server.address().port;
console.log("Example app listening at http://%s:%s", host, port);
})
                        
                    先运行一下看看(鼠标右击app.js,然后run):
                    
                这时候你就可以访问 http://127.0.0.1:8081/,有惊喜哦!
                好了,如果你可以看到成功跳转的页面,那么服务器就建成功了。不知道你会不奇怪,我们一个页面也没有写,而且工程里面
            也没有一个html文件,怎么会有文件呢?其实我现在才发现原来写页面不一定要用html文件的呀!还记得views里面的jade文件
            吗?那就是一个页面文件。不过,我还是比较习惯使用html作为页面(其实是看不懂jade,哈哈),我要把node.js的页面文件
            改成html的。我们把app.js里面 有着 view engine setup注释的代码修改一下,这样我们就能使用html文件了。然后在views文
            件夹里面加入一个index.html文件作为主页,然后重启服务器,访问 http://127.0.0.1:8081/ ,就可以看到你写的index.html了。
            
                   因为我的demo是要实现简单的增删改查,所以为了方便就把index.html写成了这样:
<div id="query">
<label>查:</label>
<a href="/query.do">查看用户</a>
</div>
<HR>
<div id="update">
<label>改:</label>
<form action="/update.do" method="post">
<label>用户:</label><input name="name">
<label>新密码:</label><input name="password" type="password">
<input type="submit" value="submit">
</form>
</div>
<HR>
<div id="add">
<label></label>
<form action="/add.do">
<label>新增用户:</label><input name="name">
<label>密码:</label><input type="password" name="password">
<input type="submit" value="submit">
</form>
</div>
<HR>
<div>
<label></label>
<form action="/remove.do" method="post">
<label>删除用户:</label>
<input name="name">
<input type="submit" value="submit">
</form>
</div>
         从代码里面我们看到,一共有四个请求,query.do、updata.do、add.do、remove.do。如果你会servlet,那么你会问处理这个
请求的servlet呢?如果你会struts2,你会问这个请求对应的action呢?还记得之前说的router吗,路由文件就代替了mvc里面的controller。
我们在routers/index.js里面编写我们的路由代码。其实如果你打开index.js看过的话,你会看到里面有这么一段代码:
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
            这不就是访问127.0.0.1时跳转到index.html的函数吗?看完之后有没有想到springmvc里面的view跳转,可以用viewResolver来制定
前缀后缀?这个res.render()函数返回index,然后由app.js里面配置的view engine加上后缀.html,然后就访问到了主页啦!
            我们仿照这个函数写一个能够收到query.do的请求的代码。然后我们重启服务器,访问主页,点击查看用户。
router.get('/query.do',function(req,res,next){
res.json('hello!it is query.do 的反应!');//这个json函数可以向客户端发送字符串数据,理论上应该用json格式的
});
下面是后台和页面的反应:
                (怎么样,其实很简单的吧。)
                  页面的跳转我们会了,下面就开始最难的数据库的处理。
                  我们在datasource目录下面建立一个user_mongodb.js文件(忘了说了,我们首先得在数据库里面创建数据,这个就自己上网百度吧,
            很快的,只要几分钟就学会了,我是在mydb数据库里建立了个user的集合,然后在里面放了{name:String,password:String}这样子的数据,如下: )。
                    说回user_mongodb.js的事情,我直接上代码,然后一行行讲。
var mongodata = require("mongodb");
var server = new mongodata.Server('127.0.0.1',27017,{});
var db = mongodata.Db('mydb',server,{safe:true});
exports.db = db ;
                第一行:我们使用了一个mongodb模块,不过在使用这个模块之前我们得先有这个模块,我们在idea下面的工具栏里面找到terminal,
这个是idea提供的命令行,我们在里面cd到node_modules目录里面,运行npm install mongodb,然后模块就会自动安装了,当然在系统的命令
行里也是可以的,只是系统的命令行里面会跳出奇奇怪怪的东西,所以还是在terminal里面运行比较好,如果一次不行就多次,这个和网络状况
也是有关系的,我就试了三次才成功。
                第二行:和mongodb进行连接,你必须保证mongodb已经开启,也就是运行了mongo.exe。
                第三行:和mongodb里面的一个叫做mydb的数据库进行连接,我们可以通过操作db变量操作mydb数据库。
                第四行:向外部文件提供db变量。
        我们用一段代码测试一下是不是真的能连上数据库了(我喜欢写一段代码就测试一端,不然以后错哪了都不知道),下面的注释好好看一下,配合 着回调函数理解一下。
var mongodata = require("mongodb");
var server = new mongodata.Server('127.0.0.1',27017,{});
var db = mongodata.Db('mydb',server,{safe:true});
//测试代码
db.open(function (error,db) {//打开db
    db.collection("user", function (err, docs) {
//先执行collection函数,对接上user集合,然后将user集合里面的数据作为回调函数中的docs,然后就执行回调函数
if(err){
console.log("err");
}else{
docs.find().toArray(function(err,data){
console.log(data);
})
}
});
});
exports.db = db ;
                运行app.js,如果打印出了正常的json格式的字符串,那么就是成功了。
                接下来回到路由文件index.js里面。因为要使用到数据库,那么就必须要使用上面的db,这个很简单,我们在index.js的文件初始处加
        一句 var db = require('../datasource/user_mongodb').db;
                如下:
                现在我们就可以在index.js里面使用db变量了。
        我们在index.js里面写需要处理的请求函数,记得看注释:
query.do
router.get('/query.do',function(req,res,next){
db.open(function(err,db){
db.collection('user',function(err,doc){

doc.find().toArray(function(err,data){
//find函数可以去找doc里面的数据,find()可以有参数,比如find({name:xyz}),这样就是去找name为xyz的数据
//toArray函数将find()函数找到的数据变成可用的数据,然后将这些数据作为data传到之后的回调函数里面。
res.json(data);//向客户端发送找到的json格式的数据
});

});
});
});
insert.do
router.get('/add.do',function(req,res,next){
var name = req.query.name ;//在get类型的请求中,查询参数被放在query里面
var password = req.query.password ;
var newuser = {'name':name,'password':password};//构建一个新的文档,相当于关系型数据里面的一行数据

db.open(function(err,db){
db.collection('user',function(err,doc){

doc.insert(newuser,{safe:true},function(err,result){
//将newuser插入到user集合里面,然后将插入的结果返回给回调函数
if(err){
console.log('err');
}else {
res.json(result);
}
})

})
});
})
remove.do
router.post('/remove.do',function(req,res,next){//这里使用的post的请求哦!
var name = req.body.name ;//post请求的查询参数是房子啊body里面的
db.open(function (err,db) {
db.collection('user',function(err,doc){

doc.remove({name:name},{safe:true}, function (err,count) {
//remove函数第一个参数是条件,也就是移除符合条件的数据,然后返回移除的个数给回调函数
console.log(count);
res.json(name);
});

});
});
})
update.do
router.post('/update.do',function(req,res,next){
var name = req.body.name ;
var password = req.body.password ;
db.open(function(err,db){

db.collection('user',function(err,doc){
doc.update({name:name},{$set:{password:password}});
//这个函数自己理解一下吧
res.json({name:name,password:password});
});

})
});
                OK,这样的一个下demo就做好了!





                    


                        
                        
                       






       
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值