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

Posted yuanGrowing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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就做好了!




                    

                       

以上是关于node初探(很全的hello world工程)的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMq初探——Hello World

dubbo初探一之hello world

初识python:hello world 仪式感

很全很全的 JavaScript 模块讲解

Flask初探二( app.route 内部实现)

Elasticsearch Java API 很全的整理