NodeJS + MongoDB + Express  搭建步骤

来源:互联网 发布:宏源证券交易软件 编辑:程序博客网 时间:2024/06/05 04:09
转载出处:http://blog.sina.com.cn/s/blog_777f59990101p1no.html

以下内容仅为Windows下的搭建
-----------------------------------------------------------------------------------------------

1、装NodeJS

2、改系统系统环境变量(要是忘了怎么改自行百度)
  • ...\nodejs (此路径为nodejs安装的路径)

3、装Express
  • PS:-g 表示全局,所以打开命令行窗口既输入以下命令

  npm install -g express



4、创建项目
  • 建一个工作区,即某盘下的文件夹,如:nodedemo
  • 进入工作区文件夹,建express项目:

  express -e myproject


   项目结构:
  • node_modules:存放所有的项目依赖库。(每个项目管理自己的依赖,与Maven、Gradle等不 同)
  • package.json:项目依赖配置及开发者信息
  • app.js:程序启动文件
  • public:静态文件(css、js、img)
  • routes:路由文件(MVC中的C,controller)
  • views:页面文件(ejs模板)

   之前下载的express貌似有点问题,重新在本项目里面下载一个:

  npm install express


   此时在myproject目录下也存在了node_modules目录,同时保存了express程序包。

 

   程序运行之后就会出现以下的提示信息:

        Express server listening on port 3000

   表示在3000的端口监听。随后打开浏览器输入:

           http://localhost:3000



5、安装ejs

  • myproject目录下:

 npm install ejs



6、安装supervisor组件包
    现在有一个小小的问题出现了,如果要想运行Node.js程序,则现在只能够使用“node app.js”,而这样的运行方式,如果在app.js文件修改之后往往需要重新启动才可以加载新的内容,这对于开发是非常不方便的, 为此,可以使用一个supervisor组件包,它可以动态的加载修改之后的开发程序。
  • 下载supervisor

 npm install -g supervisor

  • 进入项目目录,利用supervisor运行程序:

supervisor app.js


    以后项目之中,每一次文件的改变,那么都可以及时的监听到,同时也可以及时加载新的代码文件,对于开发是非常方便,但是有一点不方便:每一次修改的时候如果代码有错,后台会一直报错。


7、开始编写代码阶段

     本次要开发一个简单的登录程序,而这个用户登录程序,也分为两个开发步骤完成:第一步:是固定的用户名和密码完成、第二步:是基于MongoDB进行的登录开发。
  • EJS是WEB的模板引擎之一。EJS是一个JavaScript模板库,用来从JSON数据中生成HTML字符串。可以方便地给出用户明确、维护性良好的HTML代码结构。
        之前通过代码可以发现,所有用户需要保存的页面都应该保存在views目录下,但是此时index.ejs是一个html页面,而有的人不习惯于使用ejs,习惯于使用html,为了解决这样的问题,则需要配置模板。

  • 修改模板文件配置

       定义加载的项目模块

var ejs = require('ejs') ; // require()函数表示要加载的模块

         需要增加一些相关的配置;

app.engine('html',ejs.__express) ;app.set('view engine', 'html'); // 替换:app.set('view engine', 'ejs');

        views中的index.ejs文件修改为index.html文件,观察是否可以改变。

  • 下面编写一个用户的登录,登录的时候只提供用户iduserid)和密码,下面建立几个相关的操作页面:login.htmlwelcome.html。但是在建立这两个文件的时候,请一定要注意,文件的编码必须设置为UTF-8,否则无法操作中文。

范例:定义login.html

<!DOCTYPE html><html>  <head>    <title><%= title %></title>    <link rel='stylesheet' href='/stylesheets/style.css' />  </head>  <body>   <h1><%= title %></h1><form method="post">         用户ID:<input type="text" name="userid" id="userid"><br>         密  码:<input type="password" name="password" id="password"><br>         <input type="submit" value="登录">         <input type="reset" value="重置"></form></body></html>

范例:定义欢迎页 —— welcome.html

<!DOCTYPE html><html>  <head>    <title>Welcome</title>    <link rel='stylesheet' href='/stylesheets/style.css' />  </head>  <body>    <h1>欢迎<%=user.userid%>光临!</h1>    <h1><a href="logout">注销</a></h1>  </body></html>

范例:修改index.html页面,增加登录的链接地址

<!DOCTYPE html><html>  <head>    <title><%= title %></title>    <link rel='stylesheet' href='/stylesheets/style.css' />  </head>  <body>    <h1><%= title %></h1>    <p><a href="login">用户登录</a></p>     </body></html>

         在每一个页面之中并没有定义直接的连接,因为Node.js依然属于MVC设计模式的范畴,所以针对于MVC的实现,此处所编写的全部都属于映射名称,所有的映射路径都需要通过app.js进行相应的路由配置。


  • 设计路由功能

本登陆程序通过以下的几个页面完成:
  • 访问路径:/,页面:index.html,不需要登陆,可以直接访问
  • 访问路径:/welcome,页面:welcome.html,必须用户登陆后,才可以访问
  • 访问路径:/login,页面:login.html,登陆页面,用户名密码输入正确,自动跳转到home.html
  • 访问路径:/logout,页面:无,退出登陆后,自动回到index.html页面

   修改app.js:

app.get('/', routes.index);app.get('/login', routes.login); // 此处还需要routes/index.js修改app.post('/login', routes.doLogin);   // 处理post请求,表单提交app.get('/logout', routes.logout);      // 处理注销app.get('/welcome', routes.welcome);                 // 进入到首页

注:get为get请求,post为post请求,all为所有针对这个路径的请求


    而这5个操作路径配置完成之后,还需要找到routes/index.js文件进行相关的回调函数的配置操作。
范例:修改index.js文件
exports.index = function(req, res){  res.render('index', { title: 'Express' });};exports.login = function(req, res){  res.render('login', { title: '用户登录' });};exports.doLogin = function(req, res){         var user = {userid:'mldnadmin' , password:'hellojava'} ;      // 固定数据         // 如果要想接收请求,通过req对象         if (req.body.userid==user.userid && req.body.password==user.password) {                   res.redirect("/welcome?uid=" + req.body.userid) ;      // 地址重写         }         res.redirect("/login") ;};exports.logout = function(req, res){  res.render('login', { title: '用户注销' });};exports.welcome = function(req, res){         // 如果是地址栏参数使用req.query.参数名称接收         var user = {                   userid : req.query.uid   }  res.render('welcome', { title: '程序首页' , user:user });};
     那么在整个的基础过程之中,最为重要的步骤就配置app.js中的路由,当然,路由的最终控制是通过index.js文件完成的,在这个文件就相当于Java中的Servlet功能,负责跳转。


8、利用MongoDB来解决数据库的登录问题

    MongoDB可以说是在以后未来发展之中,在中小型数据库的市场上一定是具备发展优势的数据库。而且与Node.js的结合也非常的方便,并且多种多样。
    MongoDB和Oracle数据库完全是不一样的操作结构:MongoDB使用的是文档存储,而Oracle采用的是表存储。

   MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案;
   MongoDB采用NoSQL技术,以文档的方式进行存储。

SQL:作为整个数据库的开发标准已经存在了几十年了,可是NoSQL技术最早的提出指的是不使用SQL使用。但是后来发现不能够离开SQL,所以NoSQL又被翻译为:Not Only SQL(不仅SQL)。 
下载MongoDB:http://www.mongodb.org/

  • 配置MongoDB
将下载的压缩包直接进行解压缩,解压缩目录为d:/mongodb;
将D:\mongodb\bin配置到操作系统的PATH属性之中;

    下载下来的MongoDB是一个*.zip文件,直接将其解压缩后就可以使用了。但是在使用之前,还需要为其进行path环境的配置:D:\mongodb\bin。
    以后使用mongodb暂时将其定义为在d盘上,所以现在需要在d盘上建立一个data/db的文件目录。
    随后打开一个新的命令行窗口,让路径设置在d盘路径下,首先启动mongodb服务:

 mongod.exe


    输出结果:
        Wed Aug 14 16:13:19.739 [initandlisten] MongoDB starting : pid=4344 port=27017 dbpath=\data\db\ 32-bit host=cab34d4eb860431

  • 创建数据库及users文档
     输入mongo.exe命令,启动mongodb数据库;
     创建数据库名称(mydb):

  use mydb;


     创建新的users文档(userid、name、password)同时设置数据:

   db.users.insert({userid:'me',name:'yexinxie',password:'hello'});

   db.users.insert({userid:'me2',name:'xiexiaoha',password:'nodejs'});


    此时可以通过show tables查看所有的集合,已经发现存在了users集合。下面查询全部:

   db.users.find();


    此处为了方便,所以所有的密码并没有采用加密的处理方式。
   可是如果现在直接利用node.js提供的mongodb操作不方便使用。

  • 安装mongoose
    mongoose提供了一种更加方便的通过Node.JS访问MongoDB的操作,如果直接使用MongoDB直接操作数据库,可能会出现"db object already connecting,open cannot be called multiple time"错误信息,主要原因是必须首先open()打开数据库,而后必须使用close()关闭数据库,而对于异步处理不好时(就算处理的再好也一样)出现此类错误。
    所以在处理mongodb的时候建议使用express-mongoose组件(在项目目录下):

  npm install express-mongoose


           此组件可以和express组件完美的搭档。
         还需要下载一个mongoose的组件:

  npm install mongoose


  • 实现数据库验证
         当mongodb配置完成之后,下面就首先需要定义一个与Users集合有关的新的组件。类似于VO类的概念,只不过现在这个类需要通过*.js文档描述,在routes目录下创建models.js文件。
         由于此处要进行数据库操作,所以先根据users数据表创建一个模型,此模型名称为models.js文件,文件内容如下:
var mongoose = require('mongoose') ;     // 定义使用组件var Schema = mongoose.Schema ;  // 创建模式var UserSchema = new Schema({         userid : String ,         name : String ,         password : String}) ;    // 定义了一个新的模式,但是此模式还未和users集合有关联exports.User = mongoose.model('User',UserSchema) ;       // 与Users表关联

        修改index.js文件,操作数据库:
var mongoose = require('mongoose') ;     // 导入组件var models = require('./models') ;    // 导入自定义组件var User = models.User ;       // 使用User模型,对应的users表mongoose.connect('mongodb://localhost/mydb') ;    // 连接数据库

       现在最需要改变的就是doLogin操作,因为此处需要使用数据库验证。
       如果要想完成登录验证,只需要根据用户名和密码取得数据量即可。

  db.users.count({userid:'me',password:'hello'});


      只需要根据返回的数量就可以确定用户名和密码是否正确。
exports.doLogin = function(req, res){         // 现在拼凑出了一个基本的字符串         var query_doc = {userid:req.body.userid , password:req.body.password} ;    // 固定数据         User.count(query_doc,function(err,doc){// 直接利用mongodb的命令进行操作                   if(doc == 0) {      // 输入错误,没有此信息                            res.redirect("/login") ;                   } else {       // 成功                            res.redirect("/welcome?uid=" + req.body.userid) ;      // 地址重写                   }         }) ;};

      而且最为关键的是整个过程之中,不再去考虑数据库的关闭问题,极大的方便了用户开发。


9、总结

        可以发现,如果要实现Node.JS + MongoDB开发,最为痛苦的地方就是各个组件包的管理,而且最麻烦的是Node.JS之中有上万个组件包。
        使用这种轻量的开发方式绝对要比PHP + MySQL更加强大。
0 0