Node.JS + MongoDB技术浅谈
看到一个Node.JS + MongoDB的小样例,分享给大家。魔乐科技软件学院(www.mldnjava.cn)的讲座
Node.JS + MongoDB技术讲座
云计算 +大数据 = 未来。
在中国的云计算上基本上是一个概念,个人感觉与当初的SOA没有太大的差别,空泛的理论。
中小型开发的未来 = Node.JS + MongoDB解决,并非说Java就没用了。
1、在前面的话
Java技术始终作为高端软件用户的首选,仅仅要从事大型的软件开发,那么Java都是必需要使用的技术,尤其是在中国的相关项目之中,Java是会作为不二的选择。
全部的server端技术本质上没有太多差别,都须要WEB Server,都须要一些主要的server端开发代码。都须要操作数据库。或者增加一些其它的操作支持。
开发之中你们最大的难关:server端代码是写完了,但是假设在修饰界面有问题的时候。往往出面的还是你。缺少不同平台的交流。
2003年之后開始流行的WebService彻底的改变了这一个现状。
发现,JSON作为数据的传输,以及前后台都採用JavaScript应该能够方便的进行开发。
个人对JavaScript看法:
1、 最早的时候我们常常会纠结于一个问题:数据的验证是在前台做还是在后台做?在这段时间之内,加上浏览器的战争,导致了JavaScript无用论;
2、 2005年開始中国流行的AJAX技术開始。JavaScript能够操作异步处理。并且使用DOM解析也能够动态的操作HTML页面。基于XML的传输数据。
3、 JQuery技术包装了一系列的DOM解析操作,简化了JavaScript的操作;
可是无论怎样改变,在之前。JavaScript能够做的工作仅仅是在client执行。那么把JavaScript是否能改动一下,加强其功能,让其能够变成适合server端的开发。就造就了Node.JS。
今天的目的不是解说Node.JS的相关语法。仅仅是感受Node.JS的开发方便。
个人猜測:在PHP +MySQL逐步萎靡的今天,代替它们的应该就是Node.JS + MongoDB。
2、使用Node.JS开发WEB应用
2.1、搭建开发环境
Node.JS是一个平台,并且这个平台使用的C++开发,基于JavaScript作为前台的表现语言。
它是server端的语言。可是真的不须要去配置server。
Node.js下载完毕后须要首先进行安装。
在使用Node.JS过程之中一定须要始终连接网络。总须要从网上下载对应的开发包。
安装完毕之后会出现对应的可运行命令,而如今这些命令不属于windows,所以须要将文件夹配置到path环境属性之中。不同路径之间要使用“;”分隔。
Express是整个Node.js之中最为经常使用的一个框架(开发包),使用它能够方便的高速构建起一个WEB项目。
首先Express是一个Node.js最为经常使用的一个开发包,那么应该首先将其下载,并且下载的方式分为两种:仅仅针对于一个项目进行开发包的下载,或者是针对于整个Node.js开发环境。
如今下载开发包:
|
npm install -g express |
之后会出现很多的提示信息,提示用户的相关下载的进度。
下载完毕之后,全部的全局包都保存在一个固定的文件夹:
|
C:\Documents and Settings\Administrator\Application Data\npm |
仅仅要是开发项目,那么肯定须要一个保存项目的文件文件夹,此时的文件夹就将其定义为mldnnodedemo。
|
mkdir mldnnodedemo |
而后进入到此文件夹之中(就想象为Eclipse的工作区,一个工作区之中能够定义多个项目。
|
cd mldnnodedemo |
以下是一个很重要的步骤,须要创建一个express项目(有明白的目录要求)。
|
express -e myproject |
此时就表示项目建立完毕了,就算你使用Eclipse的相关插件,也必须依照此步骤进行操作。
而创建的项目之中存在
了一个app.js文件,那么这个文件就作为了整个程序执行的主文件出现,即:仅仅须要执行它。就能够执行HTTP Server。
|
http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); }); |
此时。http的服务将在3000port上监听用户的请求。
假设要想启动server。直接进入到myproject文件夹里面,输入:node app.js。
之前下载的express貌似有点问题,又一次在本项目里面下载一个:“npm install express”。此时在myproject文件夹下也存在了node_modules文件夹。同一时候保存了express程序包。
程序执行之后就会出现下面的提示信息:
|
Express server listening on port 3000 |
表示在3000的port监听。
随后打开浏览器输入:http://localhost:3000
继续安装ejs:npm install ejs。
这个就是默认显示界面。这个界面的内容保存在views文件夹下。
可是如今有一个小小的问题出现了,假设要想执行Node.js程序。则如今仅仅能够使用“node app.js”,而这种执行方式。假设在app.js文件改动之后往往须要又一次启动才干够载入新的内容,这对于开发是很不方便的, 为此。能够使用一个supervisor组件包,它能够动态的载入改动之后的开发程序。
下载:supervisor
|
npm install -g supervisor |
随后直接利用supervisor方式执行程序:
|
supervisor app.js |
以后项目之中,每一次文件的改变,那么都能够及时的监听到,同一时候也能够及时载入新的代码文件,对于开发是很方便,可是有一点不方便:每一次改动的时候假设代码有错。后台会一直报错。
2.2、编写代码
以下要进行正规的开发了,本次要开发一个简单的登录程序,而这个用户登录程序,也分为两个开发步骤完毕:第一步:是固定的username和password完毕、第二步:是基于MongoDB进行的登录开发。
之前通过代码能够发现。全部用户须要保存的页面都应该保存在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文件,观察能否够改变。
以下编写一个用户的登录。登录的时候仅仅提供用户id(userid)和password,以下建立几个相关的操作页面:login.html、welcome.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进行对应的路由配置。
|
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); // 进入到首页 |
而这5 个操作路径配置完毕之后。还须要找到routes/index.js文件进行相关的回调函数的配置操作。
范例:改动index.js文件
|
/* * GET home page. */ 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功能,负责跳转。
3、利用MongoDB来解决数据库的登录问题
MongoDB能够说是在以后未来发展之中。在中小型数据库的市场上一定是具备发展优势的数据库。并且与Node.js的结合也很的方便。并且多种多样。
MongoDB和Oracle数据库全然是不一样的操作结构:MongoDB使用的是文档存储。而Oracle採用的是表存储。
|
列名称 |
列名称 |
列名称 |
列名称 |
列名称 |
|
sdf |
fsd |
fsda |
fsda |
fsda |
|
fdsa |
fsdafdsa |
fdsa |
fsad |
fsda |
|
fsda |
af |
324 |
dsf |
2342 |
3.1、搭建好开发环境
SQL:作为整个数据库的开发标准已经存在了几十年了。但是NoSQL技术最早的提出指的是不使用SQL使用。但是后来发现不可以离开SQL,所以NoSQL又被翻译为:Not Only SQL(不仅SQL)。
下载MongoDB:http://www.mongodb.org/。
下载下来的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 |
Mongodb服务启动之后。以下也相同须要打开一个新的命令行窗体,使用mongo进行操作。
打开命令行窗体输入:mongo.exe命令。启动mongodb的命令窗体。
范例:创建一个新的数据库(mongodb里没有数据库):
|
use mldndb |
范例:设置一个users文档
|
db.users.insert({userid:'mldn',name:'lixinghua',password:'hello'}) ; db.users.insert({userid:'mldnjava',name:'mole',password:'nodejs'}) ; |
此时能够通过showtables查看所有的集合。已经发现存在了users集合。以下查询所有:
|
db.users.find(); |
此处为了方便,所以全部的password并没有採用加密的处理方式。
但是假设如今直接利用node.js提供的mongodb操作不方便使用。
所以在处理mongodb的时候建议使用express-mongoose组件。
|
npm install express-mongoose |
此组件能够和express组件完美的搭档。
还须要下载一个mongoose的组件。:npm install mongoose
3.2、实现数据库验证
当mongodb配置完毕之后,以下就首先须要定义一个与Users集合有关的新的组件。类似于VO类的概念,仅仅只是如今这个类须要通过*.js文档描写叙述。在routes文件夹下创建models.js文件。
范例:创建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/mldndb') ; // 连接数据库 |
如今最须要改变的就是doLogin操作,由于此处须要使用数据库验证。
假设要想完毕登录验证,仅仅须要依据username和password取得数据量就可以。
|
db.users.count({userid:'mldn',password:'hello'}) ; |
仅仅须要依据返回的数量就能够确定username和password是否正确。
|
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) ; // 地址重写 } }) ; }; |
并且最为关键的是整个过程之中,不再去考虑数据库的关闭问题。极大的方便了用户开发。
4、总结
能够发现。假设要实现Node.JS+ MongoDB开发,最为痛苦的地方就是各个组件包的管理,并且最麻烦的是Node.JS之中有上万个组件包。
使用这样的轻量的开发方式绝对要比PHP + MySQL更加强大。
Node.JS + MongoDB技术浅谈的更多相关文章
- Node.js:Buffer浅谈
Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...
- .net中对象序列化技术浅谈
.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储 ...
- 《Node.js+MongoDB+AngularJS Web开发》读书笔记及联想
总体介绍 <Node.js+MongoDB+AngularJS Web开发>,于2015年6月出版,是一本翻译过来的书,原书名为<Node.js,MongoDB and Angula ...
- 8 步搭建 Node.js + MongoDB 项目的自动化持续集成
任何事情超过 90 秒就应该自动化,这是程序员的终极打开方式.Automating shapes smarter future. 这篇文章中,我们通过创建一个 Node.js + MongoDB 项目 ...
- AngularJS + Node.js + MongoDB开发
AngularJS + Node.js + MongoDB开发的基于位置的通讯录(by vczero) 一.闲扯 有一天班长说了,同学们希望我开发一个可以共享位置的通讯录,于是自己简单设计了下功能.包 ...
- node.js + mongodb
node.js + mongodb 这次内容是结合bootstrap把登陆注册做好,还有就是express的中间件等问题. 看这篇博客之前建议先看我上篇写的那篇博客http://www.cnblogs ...
- [技术]浅谈OI中矩阵快速幂的用法
前言 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题. 基本介绍 (该部分为入门向,非入门选手可以跳过) 由 m行n列元素排列成的矩形阵列.矩阵里的 ...
- 用Node.JS+MongoDB搭建个人博客(页面模板)(五)(结束)
<差不多先生> 我是差不多先生,我的差不多是天生.也代表我很天真,也代表我是个闲人.这差不多的人生,总是见缝插针. 求学的道路上总是孤独的,即使别人不理解我,认为我是奇葩!但没关系,我会坚 ...
- node.js+mongodb 爬虫
demo截图: 本demo爬瓜子二手车北京区的数据 (注:需要略懂 node.js / mongodb 不懂也没关系 因为我也不懂啊~~~) 之所以选择爬瓜子二手车网站有两点: 一.网站无需登录,少做 ...
随机推荐
- bat处理文件
bat处理文件 作用:可以一次性执行多个命令的文件. 为什么要学bat处理文件? 快速运行一个软件一般都会把软件打包一个jar包,但是jar双击可以运行仅对图形化界面的软件起作用,对于控制台的程序是不 ...
- JavaScript 变量类型 保存内存中的位置 和 引用
1. JavaScript变量 基本类型值在内存中占据固定大小的空间 因此被保存在栈内存中. 从一个变量向另一个变量复制基本来下的值 会创建这个值得一个副本. 引用类型的值是对象 保存在堆内存中. 包 ...
- .NET基础拾遗(5)反射1
1.反射产生的背景 对无法直接添加引用的程序集中类型元素的动态获取和使用.使用场景如插件开发,vs本身的智能提示. 2.反射的基本原理 依托于元数据,运行时动态获取并构建程序集.模块.类型及字段等目标 ...
- css重点
1.CSS的盒子模型? (1)两种, IE 盒子模型.标准 W3C 盒子模型:IE 的content部分包含了 border 和 pading; (2)盒模型: 内容(content).填充(padd ...
- 使用Fiddler抓取手机上的数据包
在IIS中,如果网站已经绑定了域名在使用IP是不能访问的,需要添加一个空的主机名与IP的映射才能访问.如下图: Fiddler抓取手机包 在PC上建一个WIFI热的 勾选Fiddler中Tool-&g ...
- Android入门3:从Toolbar到Material Design
在Android5.0(API 21)之后,Toolbar被Google推广,逐渐走入大家视野.具体关于Actionbar和Toolbar的对比就不多啰嗦了,跟着潮流走是没错的.下面先上张简单的效果图 ...
- HashMap陷入死循环的例子
//使用这个例子可以模拟HashMap陷入死循环的效果,可能需要执行多次才会出现. 1 package com.hanzi; import java.util.HashMap; public clas ...
- 查看Linux系统相关版本信息
1.“uname -a” 查看电脑以及操作系统的相关信息 2.“cat /proc/version” 查看运行的内核版本 3."cat /etc/redhat-release", ...
- 启动两个tomcat
因为项目的种种原因,必须启动两个tomcat测试 于是复制tomcat,改端口,报错,到日志看,发现shutdow端口也需要改 总结 server.xml改两个地方的端口 <Server por ...
- android中handler使用应该注意的问题(解决由handler引起的OOM内存泄漏)
最近,在项目过程中频繁的使用handler处理一些ui线程上的操作,以及使用handler的postdealy.然而使用过后却不对handler进行处理,进而产生了内存溢出现象,通过google,发现 ...