大熊君大话NodeJS之------基于Connect中间件的小应用(Bigbear记事本应用之第一篇)

一,开篇分析

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

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

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

二,需求分析

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

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

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

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

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

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

  

 1 <!doctype html>
 2 <html>
 3     <head>
 4         <title>Bigbear记事本应用登录</title>
 5         <meta content="IE=8" http-equiv="X-UA-Compatible"/>
 6         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7         <style type="text/css">
 8             .note-title {
 9                 margin-bottom : 45px ;
10                 background : #6699cc ;
11                 font-size : 14px ;
12                 font-weight : bold ;
13                 color : #fff;
14                 font-family:arial ;
15                 height : 24px ;
16                 line-height : 24px ;
17             }
18             a {
19                 color : #336699;
20                 font-family:arial ;
21                 font-size : 14px ;
22                 font-weight : bold ;
23             }
24         </style>
25         <script src="js/index.js"></script>
26     </head>
27     <body>
28         <div class="note-title">Bigbear记事本应用登录</div>
29             <form action="/login" method="post">
30                 <span>用户名:</span><input type="text" name="name" /><br/><br/>
31                 <span>密&nbsp;&nbsp;码:</span><input type="password" name="password" />
32                 <input type="submit" value="登录" />
33                 <a href="reg.html">我要注册</a>
34             </form>
35     </body>
36 </html>

  效果图:

  

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

 1 <!doctype html>
 2 <html>
 3     <head>
 4         <title>Bigbear记事本应用注册</title>
 5         <meta content="IE=8" http-equiv="X-UA-Compatible"/>
 6         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7         <style type="text/css">
 8             .note-title {
 9                 margin-bottom : 45px ;
10                 background : #ff3300 ;
11                 font-size : 14px ;
12                 font-weight : bold ;
13                 color : #fff;
14                 font-family:arial ;
15                 height : 24px ;
16                 line-height : 24px ;
17             }
18         </style>
19         <script src="js/index.js"></script>
20     </head>
21     <body>
22         <div class="note-title">Bigbear记事本应用注册</div>
23             <form action="/reg" method="post">
24                 <span>用户名:</span><input type="text" name="name" /><br/><br/>
25                 <span>密&nbsp;&nbsp;码:</span><input type="password" name="password" /><br/><br/>
26                 <input type="submit" value="注册" />
27             </form>
28     </body>
29 </html>

  效果图:

  

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

 

 1 var mongodb = require("mongodb") ;
 2 var server = new mongodb.Server("localhost",27017,{
 3     auto_reconnect : true
 4 }) ;
 5 var conn = new mongodb.Db("bb",server,{
 6     safe : true
 7 }) ;
 8 conn.open(function(error,db){
 9     if(error) throw error ;
10     console.info("mongodb connected !") ;
11 }) ;
12 exports = module.exports = conn ;

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

 

 1 var conn = require("../conn") ;
 2 function User(user){
 3     this.name = user["name"] ;
 4     this.password = user["password"] ;
 5 } ;
 6 User.prototype.save = function(callback){
 7     var that = this ;
 8     conn.collection("users",{
 9         safe : true
10     },function(error,collection){
11         if(error) return conn.close() ;
12         collection.findOne({   // 判断此用户是否存在
13             name : that.name
14         },function(error,user){
15             if(error) return conn.close() ;
16             if(!user){
17                 collection.insert({
18                     name : that.name + "" ,
19                     password : that.password + ""
20                 },{
21                     safe : true
22                 },function(error,user){
23                     if(error) return conn.close() ;
24                     callback && callback(user) ;
25                     conn.close() ;
26                 }) ;
27             }
28             else{
29                 callback("User has registed !") ;
30             }
31         }) ;
32     }) ;
33 } ;
34 User.login = function(name,password,callback){
35     conn.collection("users",{
36         safe : true
37     },function(error,collection){
38         if(error) return conn.close() ;
39         collection.findOne({
40             name : name ,
41             password : password
42         },function(error,user){
43             if(error) return conn.close() ;
44             callback && callback(user) ;
45             conn.close() ;
46         }) ;
47     }) ;
48 } ;
49 exports = module.exports = User ;

  效果图:

    

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

 

 1 // app.js
 2 var connect = require("./lib/connect") ;
 3 var user = require("./models/user") ;
 4 var app = connect.createServer() ;
 5 app .use(connect.logger("dev"))
 6 .use(connect.query())
 7 .use(connect.bodyParser())
 8 .use(connect.cookieParser())
 9 .use(connect.static(__dirname + "/views"))
10 .use(connect.static(__dirname + "/public"))
11 .use("/login",function(request,response,next){
12     var name = request.body["name"] ;
13     var password = request.body["password"] ;
14     user.login(name,password,function(user){
15         if(user){
16             response.end("Welcome to:" + user["name"] + " ^_^ ... ...") ;
17         }
18         else{
19             response.end("User:" + name + " Not Register !")    ;
20         }
21     }) ;
22 })
23 .use("/reg",function(request,response,next){
24     var name = request.body["name"] ;
25     var password = request.body["password"] ;
26     new user({
27         name : name ,
28         password : password
29     }).save(function(user){
30         if(user && user["name"]){
31           response.end("User:" + name + "Register Done !")    ;
32         }
33         else{
34           response.end("User: " + name + "has registed !") ;
35         }
36     }) ;
37 })
38 .listen(8888,function(){
39     console.log("Web Server Running On Port ---> 8888 .") ;
40 }) ;

  说明一下:

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

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

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

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

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

      

四,总结一下

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

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

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

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

          
              哈哈哈,本篇结束,未完待续,希望和大家多多交流够沟通,共同进步。。。。。。呼呼呼……(*^__^*)             

时间: 2024-10-23 20:40:18

大熊君大话NodeJS之------基于Connect中间件的小应用(Bigbear记事本应用之第一篇)的相关文章

大熊君大话NodeJS之------Net模块

一,开篇分析 从今天开始,我们来深入具体的模块学习,这篇文章是这个系列(大熊君大话NodeJS)文章的第三篇,前两篇主要是以理论为主,相信大家在前两篇的学习中, 对NodeJS也有一个基本的认识,没事!!!趁热打铁,让我们继续将NodeJS进行到底,好了废话不多说,直接进入今天的主题 “Net模块” ,那么”Net“应该如何理解那? 它是做什么用的那?(Net模块可用于创建Socket服务器或Socket客户端. NodeJS 的数据通信,最基础的两个模块是 Net 和 Http,前者是基于 T

大熊君大话NodeJS之------FS文件模块

一,开篇分析 文件系统模块是一个简单包装的标准 POSIX 文件 I/O 操作方法集.可以通过调用 require("fs") 来获取该模块.文件系统模块中的所有方法均有异步和同步版本. (1),文件系统模块中的异步方法需要一个完成时的回调函数作为最后一个传入形参. (2),回调函数的构成由调用的异步方法所决定,通常情况下回调函数的第一个形参为返回的错误信息. (3),如果异步操作执行正确并返回,该错误形参则为null或者undefined.如果使用的是同步版本的操作方法,一旦出现错误

大熊君大话NodeJS之开篇------Why NodeJS(将Javascript进行到底)

一,开篇分析 大家好啊,大熊君又来啦(*^__^*) 嘻嘻……,之前我写过一系列关于JS(OOP与设计模式)方面的文章,反响还好,其实这也是对我本人最大的鼓励,于是我决定我要将JavaScript进行到底 准备写一个NodeJS方面的系列文章,由浅入深,循序渐进,秉承的理念是重思想,多实践,勤能补拙,贵在坚持. 我们先来看看NodeJS官网上的介绍: 其特点为: 1,它是一个Javascript运行环境 2,依赖于Chrome V8引擎进行代码解释 3,事件驱动 4, 非阻塞I/O 5, 轻量.

大熊君大话NodeJS之------Http模块

一,开篇分析 首先“Http”这个概念大家应该比较熟悉了,它不是基于特定语言的,是一个通用的应用层协议,不同语言有不同的实现细节,但是万变不离其宗,思想是相同的, NodeJS作为一个宿主运行环境,以JavaScript为宿主语言,它也有自己实现的一套标准,这篇文章我们就一起来学习一下 “Http模块” .但是作为前提来说, 希望大家可以先阅读一下官网提供的api,有一个前置了解,这样就方便多了,以下是Http部分的api概览: HTTP http.STATUS_CODES http.creat

大熊君大话NodeJS之------MongoDB模块(额外篇)

一,开篇分析 这篇属于扩展知识篇,因为在下面的文章中会用到数据库操作,所以今天就来说说它(Mongodb模块). (1),简介 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bj

大熊君大话NodeJS之------Stream模块

一,开篇分析 流是一个抽象接口,被 Node 中的很多对象所实现.比如对一个 HTTP 服务器的请求是一个流,stdout 也是一个流.流是可读,可写或兼具两者的. 最早接触Stream是从早期的unix开始的, 数十年的实践证明Stream 思想可以很简单的开发出一些庞大的系统. 在unix里,Stream是通过 "|" 实现的.在node中,作为内置的stream模块,很多核心模块和三方模块都使用到. 和unix一样,node stream主要的操作也是.pipe(),使用者可以使

大熊君大话NodeJS之------Global Objects全局对象

一,开篇分析 在上个章节中我们学习了NodeJS的基础理论知识,对于这些理论知识来说理解是至关重要的,在后续的章节中,我们会对照着官方文档逐步学习里面的各部分模块,好了该是本文主角登台亮相的时候了,Global  让我们来看一下官方的定义: Global Objects全局对象 These objects are available in all modules. Some of these objects aren't actually in the global scope but in t

大熊君大话NodeJS之------Buffer模块

一,开篇分析 所谓缓冲区Buffer,就是 "临时存贮区" 的意思,是暂时存放输入输出数据的一段内存. JS语言自身只有字符串数据类型,没有二进制数据类型,因此NodeJS提供了一个与String对等的全局构造函数Buffer来提供对二进制数据的操作.除了可以读取文件得到Buffer的实例外,还能够直接构造,例如: var buffer = new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]) ; Buffer与字符串类似,除了可以用.length属

大熊君大话NodeJS之------(Url,QueryString,Path)模块

一,开篇分析 这篇文章把这三个模块拿来一起说,原因是它们各自的篇幅都不是很长,其次是它们之间存在着依赖关系,所以依次介绍并且实例分析.废话不多说了,请看下面文档: (1),"Url模块" 来个小栗子: 1 var url = require('url'); 2 var queryUrl = "http://localhost:8888/bb?name=bigbear&memo=helloworld" ; 3 console.log(typeof url.pa