NodeJS学习笔记之Connect中间件应用实例


Posted in NodeJs onJanuary 27, 2015

一,开篇分析

大家好哦,大熊君又来了,昨天因为有点个人的事没有写博客,今天又出来了一篇,这篇主要是写一个记事本的小应用,前面的文章,

我也介绍过“Connect”中间件的使用以及“Mongodb”的用法,今天就结合这两个中间件,写个实际的例子,不断完善和重构,已达到

充分学习的目的。好了,废话不说了,直接进入主题。

二,需求分析

(1),用户注册,登录功能(没有涉及很复杂的交互场景,注册时会有用户判断是否已存在)。

(2),用户登录成功,进入笔记管理系统的后台(笔记模块的增删改查功能)。

(3),用户可以具有简单的权限划分(管理员,注册用户)。

(4),界面比较简单,以学习为主。

三,开始设计应用(第一部分)

(1),建立用户登录页面,代码如下:

<!doctype html>

<html>

    <head>

        <title>Bigbear记事本应用登录</title>

        <meta content="IE=8" http-equiv="X-UA-Compatible"/>

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

        <style type="text/css">

            .note-title {

                margin-bottom : 45px ;

                background : #6699cc ;

                font-size : 14px ;

                font-weight : bold ;

                color : #fff;

                font-family:arial ;

                height : 24px ;

                line-height : 24px ;

            }

            a {

                color : #336699;

                font-family:arial ;

                font-size : 14px ;

                font-weight : bold ;

            }

        </style>

        <script src="js/index.js"></script>

    </head>

    <body>

        <div class="note-title">Bigbear记事本应用登录</div>

            <form action="/login" method="post">

                <span>用户名:</span><input type="text" name="name" /><br/><br/>

                <span>密  码:</span><input type="password" name="password" />

                <input type="submit" value="登录" />

                <a href="reg.html">我要注册</a>

            </form>

    </body>

</html>

效果图:

NodeJS学习笔记之Connect中间件应用实例

(2),建立用户注册页面,代码如下:

 <!doctype html>

 <html>

     <head>

         <title>Bigbear记事本应用注册</title>

         <meta content="IE=8" http-equiv="X-UA-Compatible"/>

         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

         <style type="text/css">

             .note-title {

                 margin-bottom : 45px ;

                 background : #ff3300 ;

                 font-size : 14px ;

                 font-weight : bold ;

                 color : #fff;

                 font-family:arial ;

                 height : 24px ;

                 line-height : 24px ;

             }

         </style>

         <script src="js/index.js"></script>

     </head>

     <body>

         <div class="note-title">Bigbear记事本应用注册</div>

             <form action="/reg" method="post">

                 <span>用户名:</span><input type="text" name="name" /><br/><br/>

                 <span>密  码:</span><input type="password" name="password" /><br/><br/>

                 <input type="submit" value="注册" />

             </form>

     </body>

 </html>

效果图:

NodeJS学习笔记之Connect中间件应用实例

(3),建立“Mongodb”连接代码,如下:

 var mongodb = require("mongodb") ;

 var server = new mongodb.Server("localhost",27017,{

     auto_reconnect : true

 }) ;

 var conn = new mongodb.Db("bb",server,{

     safe : true

 }) ;

 conn.open(function(error,db){

     if(error) throw error ;

     console.info("mongodb connected !") ;

 }) ;

 exports = module.exports = conn ;

(4),建立模型实体类“User”,如下:

 var conn = require("../conn") ;

 function User(user){

     this.name = user["name"] ;

     this.password = user["password"] ;

 } ;

 User.prototype.save = function(callback){

     var that = this ;

     conn.collection("users",{

         safe : true

     },function(error,collection){

         if(error) return conn.close() ;

         collection.findOne({   // 判断此用户是否存在

             name : that.name

         },function(error,user){

             if(error) return conn.close() ;

             if(!user){

                 collection.insert({

                     name : that.name + "" ,

                     password : that.password + ""

                 },{

                     safe : true

                 },function(error,user){

                     if(error) return conn.close() ;

                     callback && callback(user) ;

                     conn.close() ;

                 }) ;        

             }

             else{

                 callback("User has registed !") ;

             }

         }) ; 

     }) ;

 } ;

 User.login = function(name,password,callback){

     conn.collection("users",{

         safe : true

     },function(error,collection){

         if(error) return conn.close() ;

         collection.findOne({

             name : name ,

             password : password

         },function(error,user){

             if(error) return conn.close() ;

             callback && callback(user) ;

             conn.close() ;

         }) ; 

     }) ;

 } ;

 exports = module.exports = User ;

效果图:

NodeJS学习笔记之Connect中间件应用实例

(5),建立应用程序“app”,如下:

 // app.js

 var connect = require("./lib/connect") ;

 var user = require("./models/user") ;

 var app = connect.createServer() ;

 app .use(connect.logger("dev"))

 .use(connect.query())

 .use(connect.bodyParser())

 .use(connect.cookieParser())

 .use(connect.static(__dirname + "/views"))

 .use(connect.static(__dirname + "/public"))

 .use("/login",function(request,response,next){

     var name = request.body["name"] ;

     var password = request.body["password"] ;

     user.login(name,password,function(user){

         if(user){

             response.end("Welcome to:" + user["name"] + " ^_^ ... ...") ;    

         }

         else{

             response.end("User:" + name + " Not Register !")    ;

         }

     }) ;

 })

 .use("/reg",function(request,response,next){

     var name = request.body["name"] ;

     var password = request.body["password"] ;

     new user({

         name : name ,

         password : password

     }).save(function(user){

         if(user && user["name"]){

         response.end("User:" + name + "Register Done !")    ;    

         }

         else{

         
response.end("User: " + name + "has registed !") ;  

         }

     }) ;

 })

 .listen(8888,function(){

     console.log("Web Server Running On Port ---> 8888 .") ;

 }) ;

说明一下:

(1)“connect.query()”------处理“Get”请求参数解析。

(2)“connect.bodyParser()”------处理“Post”请求参数解析。

(3)“connect.static(__dirname + "/views"),connect.static(__dirname + "/public")”

 分别代表模板视图“html”以及静态资源如“js,css,jpg,gif”的资源目录。

 以下是这个应用的目录结构:

NodeJS学习笔记之Connect中间件应用实例

四,总结一下

(1),掌握NodeJs操作数据库的基本操作语句。

(2),划分层级,如模型,视图,路由。

(3),不断优化和修改本文的例子(比如注册验证用户是否存在,可以独立出“UserManager”做一层代理完成用户验证和保存的动作)。

(4),明天继续完成后续的功能,尽请期待。

NodeJs 相关文章推荐
nodejs中exports与module.exports的区别详细介绍
Jan 14 NodeJs
轻松创建nodejs服务器(8):非阻塞是如何实现的
Dec 18 NodeJs
nodejs实现获取当前url地址及url各种参数值
Jun 25 NodeJs
Nodejs从有门道无门菜鸟起飞必看教程
Jul 20 NodeJs
Nodejs 和Session 原理及实战技巧小结
Aug 25 NodeJs
浅谈NodeJs之数据库异常处理
Oct 25 NodeJs
详解nodeJs文件系统(fs)与流(stream)
Jan 24 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
手把手教你如何使用nodejs编写cli命令行
Nov 05 NodeJs
NVM安装nodejs的方法实用步骤
Jan 16 NodeJs
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
Feb 02 NodeJs
nodejs中使用worker_threads来创建新的线程的方法
Jan 22 NodeJs
NodeJS学习笔记之Connect中间件模块(二)
Jan 27 #NodeJs
NodeJS学习笔记之Connect中间件模块(一)
Jan 27 #NodeJs
nodejs批量修改文件编码格式
Jan 22 #NodeJs
NodeJS学习笔记之MongoDB模块
Jan 13 #NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 #NodeJs
NodeJS学习笔记之FS文件模块
Jan 13 #NodeJs
NodeJS学习笔记之Http模块
Jan 13 #NodeJs
You might like
PHPShop存在多个安全漏洞
2006/10/09 PHP
php判断正常访问和外部访问的示例
2014/02/10 PHP
php中的mongodb select常用操作代码示例
2014/09/06 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
php删除二维数组中的重复值方法
2018/03/12 PHP
javascrip关于继承的小例子
2013/05/10 Javascript
javascript-简单的计算器实现步骤分解(附图)
2013/05/30 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
JavaScript数组和循环详解
2015/04/27 Javascript
Highcharts 多个Y轴动态刷新数据的实现代码
2016/05/28 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
VUE多层路由嵌套实现代码
2017/05/15 Javascript
javascript函数的节流[throttle]与防抖[debounce]
2017/11/15 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
2018/04/03 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
Vue表情输入组件 微信face表情组件
2019/02/11 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
详解Vue中Axios封装API接口的思路及方法
2020/10/10 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
Python 解析XML文件
2009/04/15 Python
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
2018/06/21 Python
Flask核心机制之上下文源码剖析
2018/12/25 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
CSS3属性使网站设计增强同时不消弱可用性
2009/08/29 HTML / CSS
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
Footshop乌克兰:运动鞋的最大选择
2019/12/01 全球购物
Why we need EJB
2016/10/20 面试题
酒吧副总经理岗位职责
2013/12/10 职场文书
元旦晚会上单位领导演讲稿
2014/01/05 职场文书
大专毕业自我鉴定
2014/02/04 职场文书
文书工作总结(范文)
2019/07/11 职场文书
MySQL query_cache_type 参数与使用详解
2021/07/01 MySQL