锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / 网站前端开发中级 / 使用Express Framework和Node.js开发应用程序-快速入门
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

使用Express Framework和Node.js开发应用程序-快速入门


介绍

本文介绍了使用Node.js和Express Framework开发的示例应用程序,并使用MongoDB作为后端。
应用程序中使用了以下技术:

  • 服务器端 - Node.Js
  • ClientSide - Jquery,HTML,CSS
  • 查看分析器引擎 - Jade
  • 开发框架 - Express Framework
  • 数据库 - MongoDB

Express框架:Express是一个极小而灵活的Node.js Web应用程序框架,为Web和移动应用程序提供了一组强大的功能。
Node.js: Node.js是用于服务器端和网络应用程序的开源跨平台运行时环境。Node.js应用程序是用JavaScript编写的,可以在OS X,Microsoft Windows,Linux和FreeBSD上的 Node.js运行时中运行。
MongoDB:MongoDB是一个使用面向文档的数据模型开源数据库。MongoDB是2000年代中期NoSQL旗帜下出现的几种数据库类型之一。MongoDB不是在关系数据库中使用表和行,而是建立在集合和文档的架构上。

先决条件

资源:

安装节点包管理器(npm):
http://nodejs.org/download/
设置Visual Studio for Express Framework模板:
https://nodejstools.codeplex.com/wikipage?title=Installation
MongoDb相关资源 - 安装,运行,数据库查询:
http://docs.mongodb.org/manual/
Jade模板引擎:
http://jade-lang.com/tutorial/

使用代码

配置

如果已成功安装Visual Studio的nodejs工具,则可以创建Express Application,如下所示:
创建Express Application
我们讲解应用程序中使用的3个主要元素:

  • Node.js代码 - 服务器端
  • Jade 解析器 - 演示文稿
  • 数据库操作

项目架构

项目架构

项目结构

  • public> js>

包含相应视图的JavaScript逻辑(jquery,验证器)。

  • public> vendor>

全球JavaScript,样式表,字体。

  • 服务器>模块>

数据库管理器,服务器端代码的实用功能。例如:发送邮件实用程序。

  • 服务器>视图>

包含Jade视图。

  • node_modules

包含应用程序中使用的库。
先启动MongoDb守护程序/服务器,然后运行该项目。

Express Framework

package.json

这是应用程序的配置。它指定了应用程序所需的依赖关系(modules / libraries),如果npm install在Visual Studio的Package Manager控制台中运行' '命令时它不存在,那么它将被安装。

            {
                "name": "ExpressApp2",
                "version": "0.0.0",
                "description": "ExpressApp2",
                "main": "app.js",
                "author": {
                    "name": "tushar.gupta",
                    "email": "" 
                },
                "dependencies": {
                    "emailjs": "^0.3.3",
                    "express": "3.4.4",
                    "jade": "*",
                    "stylus": "*",
                    "moment": "^1.7.2",
                    "mongodb": "*" 
                }
            }
          

app.js

该文件设置node.js应用程序的初始化参数。

            /**
             * Module dependencies.
             */ 
            var express = require('express');
            var http = require('http');
            var path = require('path');
            var app = express();
             
            // all environments 
            //app.set('port', process.env.PORT || 3000); 
            app.set('port', 3000);
            app.set('views', path.join(__dirname, '/app/server/views'));
            app.set('view engine', 'jade');
            app.locals.pretty = true;
            //app.use(express.favicon()); 
            //app.use(express.logger('dev')); 
            app.use(express.bodyParser());
            app.use(express.cookieParser());
            app.use(express.session({ secret: 'super-duper-secret-secret' }));
            app.use(express.json());
            app.use(express.urlencoded());
            app.use(express.methodOverride());
             
            app.use(require('stylus').middleware(path.join(__dirname, '/app/public')));
            app.use(express.static(path.join(__dirname, '/app/public')));
             
            // development only 
            if ('development' == app.get('env')) {
              app.use(express.errorHandler());
            }
             
            require('./app/server/router')(app);
             
            http.createServer(app).listen(app.get('port'), function(){
              console.log('Express server listening on port ' + app.get('port'));
            });
          

router.js

该文件充当控制器并响应客户端的请求。它设置视图的数据(从服务/数据库)并发送响应。

            //Get Function 
               app.get('/', function (req, res) {
                    // check if the user's credentials are saved in a cookie // 
                    if (req.cookies.user == undefined || req.cookies.pass == undefined) {
                        res.render('login', { title: 'IB-Wall - Please Login To Your Account' });
                    } else {
                        // attempt automatic login // 
                        AM.autoLogin(req.cookies.user, req.cookies.pass, function (o) {
                            if (o != null) {
                                req.session.user = o;
                                res.redirect('/user/' + req.cookies.user);
                            } else {
                                res.render('login', { title: 'IB-Wall - Please Login To Your Account' });
                            }
                        });
                    }
                });
                
            //Post Function 
                app.post('/', function (req, res) {
                    AM.manualLogin(req.param('user'), req.param('pass'), function (e, o) {
                        if (!o) {
                            res.send(e, 400);
                        } else {
                            req.session.user = o;
                            res.cookie('user', o.user, { maxAge: 900000 });
                            res.cookie('pass', o.pass, { maxAge: 900000 });
                            
                            res.send(o, 200);
                            console.log('user login and redirecting to home');
                        }
                    });
                });
                
                //user wall page 
            //Parameters from URL     
                app.get('/user/:username', function (req, res) {
                    
                    if (req.session.user == null) {
                        
                        res.redirect('/');
             
                    } else {
                        var uName = req.param('username');
                        
                        AM.getAllRecords(function (e, accounts) {
                            AM.getUserByUname(uName, function (e, onWQallOfuser) {
                                
                                AM.getPostsForUser(onWQallOfuser, function (e, userPosts) {
                                    var uPosts = [];
                                    uPosts = userPosts;
                                    res.render('index', {
                                        title : 'Welcome to IB-Wall',
                                        udata : req.session.user,
                                        wallUserData: onWQallOfuser,
                                        accounts: accounts,
                                        userPosts: uPosts
                                    });
                                });
                            });
                        });
                    }
                });
                
            //Destroy Cookies     
                app.post('/logoutuser', function (req, res) {
                    if (req.param('logout') == 'true') {
                        res.clearCookie('user');
                        res.clearCookie('pass');
                        req.session.destroy(function (e) { res.send('ok', 200); });
                    }
                });
          

JADE - 查看模板引擎

index.jade

这是将HTML呈现给客户端的查看文件。
您可以使用许多在线转换器将HTML代码转换为Jade代码。
您可以从在线资源中更多地了解Jade。
Jade 遵循缩进风格来组合元素。

            extends walllayout
             
            block content
                include userdetails
                .wrapper
                  .box
                    .row.row-offcanvas.row-offcanvas-left
                      // sidebar
                      #sidebar.column.col-sm-2.col-xs-1.sidebar-offcanvas
                        ul.nav
                          li
                            a.visible-xs.text-center(href='#', data-toggle='offcanvas')
                              i.glyphicon.glyphicon-chevron-right
                        ul#lg-menu.nav.hidden-xs
                            each account in accounts
                              li.active
                                a(href='http://www.codeproject.com/user/#{account.user}')
                                  img.img-circle(src='http://www.codeproject.com/placehold.it/150x150', width='25px', height='25px')
                                  |  #{account.name}
          

从服务器变量和设置中获取数据以供在视图中使用。

userdetails.jade

            // preset form values if we receive a userdata object //
             
            //variables are declared by using '-' sign
             
            //Data from server can be get just by using the same variable name as declared on server end.
             
            - user = typeof(udata) != 'undefined' ? udata : { }
            - wallUser = typeof(wallUserData) != 'undefined' ? wallUserData : { }
             
            // store the userId on the client side in a hidden input field //
            input(type='hidden', value= user._id)#userId
            input(type='hidden', value= wallUser._id)#wallUserId
            input(type='hidden', value= user.name)#LoginUserFullName
            input(type='hidden', value= wallUser.name)#wallUserFullName
             
            // display form errors in a custom modal window //
             
            include modals/form-errors
          

在其他Jade页面设置母版页

            extends walllayout
          

在母版页中设置容器并在子页面中使用

            block content
          

在其他Jade页面包括Jade

            include userdetails
          

下面的代码显示了如何将脚本插入Jade页面

script(src='http://www.codeproject.com/vendor/javascripts/scripts.js')
          

下面的代码显示了如何设置标题和插入样式到Jade页面

            head
              title= title
              link(rel='stylesheet', href='http://www.codeproject.com/vendor/stylesheets/bootstrap_wall.min.css')
          

数据库操作

AccountManager.js

此文件负责以下操作:

  • 设置与mongodb数据库的连接。
  • 编写函数以从数据库中获取数据。

设置与mongodb数据库的连接

            var crypto = require('crypto');
            var MongoDB = require('mongodb').Db;
            var Server = require('mongodb').Server;
            var moment = require('moment');
             
            var dbPort = 27017;
            var dbHost = 'localhost';
            //var dbName = 'node-login'; 
            var dbName = 'manthandb-oaapt';
             
            /* establish the database connection */ 
             
            var db = new MongoDB(dbName, new Server(dbHost, dbPort, { auto_reconnect: true }), { w: 1 });
            db.open(function (e, d) {
                if (e) {
                    console.log(e);
                } else {
                    console.log('connected to database :: ' + dbName);
                }
            });
            var accounts = db.collection('accounts');
            var posts = db.collection('posts');
            var likes = db.collection('userlikes');
          

数据库查询

            //Insert 
            exports.addNewPost = function (data, callback) {
                data.createdDate = moment().format('MMMM Do YYYY, h:mm:ss a');
                posts.insert(data, function (e, postAdded) {
                    if (!e) {
                        callback(null, postAdded);
                    }
                });
            }
             
            //Select 1 
            exports.autoLogin = function (user, pass, callback) {
                accounts.findOne({ user: user }, function (e, o) {
                    if (o) {
                        o.pass == pass ? callback(o) : callback(null);
                    } else {
                        callback(null);
                    }
                });
            }
             
            //Select Multiple 
            exports.getAllRecords = function (callback) {
                accounts.find().toArray(
                    function (e, res) {
                    if (e) callback(e)
                    else callback(null, res)
                });
            };
             
            //Delete 
            exports.deleteAccount = function (id, callback) {
                accounts.remove({ _id: getObjectId(id) }, callback);
            }
          
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内