Node.js(express) + MongoDB(mongoose) 简单开发(一)

前言:

express作为一个Node框架,很适合新学习Node的同学,加上mongoose的数据处理,堪称完美~ 闲话少说,步入正题。

我的系统环境:

  • Win7 64bit
  • Nodejs: v0.10.35
  • Npm: 1.4.28
  • IDE:webstorm

    1. 建立项目

    Node及express的安装这里就不再赘述,网上有很多安装的教程,不会的同学可以自行查找,这里我们采用express4.x版本

    安装express库完成之后,我们可以使用express命令来建立一个自己的项目: express -e vlan

    可以看到express帮我们创建了一个完整的项目级目录

    express默认的是jade的模版, -e代表使用ejs, 这里我们使用ejs

    接下来进入项目目录并安装express所需的依赖

    2.目录结构

    www文件就是启动文件

    node_modules 存放所有项目的依赖

    public为静态资源存放目录,可以修改

    routes为路由文件

    views就是视图了(页面文件,ejs模板)

    3. app.js核心文件

    一般可能会改动的地方我都注释了出来, 完整的app.js文件如下

    var express = require(‘express‘);
    var path = require(‘path‘);
    var favicon = require(‘serve-favicon‘);
    var logger = require(‘morgan‘);
    var cookieParser = require(‘cookie-parser‘);
    var bodyParser = require(‘body-parser‘);
    
    var routes = require(‘./routes/index‘);
    //var users = require(‘./routes/users‘);
    var ejs = require("ejs");
    var app = express();
    
    // 视图目录
    app.set(‘views‘, path.join(__dirname, ‘views‘));
    // 使用ejs模板 (替换为html文件)
    app.engine(‘.html‘, ejs.__express);
    app.set(‘view engine‘, ‘html‘);
    //app.set(‘view engine‘, ‘ejs‘);
    
    // uncomment after placing your favicon in /public
    //app.use(favicon(__dirname + ‘/public/favicon.ico‘));
    app.use(logger(‘dev‘));
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(cookieParser());
    // 静态资源存放目录
    app.use(express.static(path.join(__dirname, ‘public‘)));
    
    app.use(‘/‘, routes);
    //app.use(‘/users‘, users);
    
    // catch 404 and forward to error handler
    app.use(function(req, res, next) {
      var err = new Error(‘Not Found‘);
      err.status = 404;
      next(err);
    });
    
    // error handlers
    
    // development error handler
    // will print stacktrace
    if (app.get(‘env‘) === ‘development‘) {
      app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render(‘error‘, {
          message: err.message,
          error: err
        });
      });
    }
    
    // production error handler
    // no stacktraces leaked to user
    app.use(function(err, req, res, next) {
      res.status(err.status || 500);
      res.render(‘error‘, {
        message: err.message,
        error: {}
      });
    });
    
    module.exports = app;
     

    查看./bin/www文件。

    #!/usr/bin/env node
    
    /**
     * Module dependencies.
     */
    
    var app = require(‘../app‘);
    var debug = require(‘debug‘)(‘vlan:server‘);
    var http = require(‘http‘);
    
    /**
     * Get port from environment and store in Express.
     */
    
    /*
    * 定义启动端口
    * */
    var port = normalizePort(process.env.PORT || ‘8080‘);
    app.set(‘port‘, port);
    
    /**
     * Create HTTP server.
     */
    
    var server = http.createServer(app);
    
    /**
     * Listen on provided port, on all network interfaces.
     */
    
    server.listen(port);
    server.on(‘error‘, onError);
    server.on(‘listening‘, onListening);
    
    /**
     * Normalize a port into a number, string, or false.
     */
    
    function normalizePort(val) {
      var port = parseInt(val, 10);
    
      if (isNaN(port)) {
        // named pipe
        return val;
      }
    
      if (port >= 0) {
        // port number
        return port;
      }
    
      return false;
    }
    
    /**
     * Event listener for HTTP server "error" event.
     */
    
    function onError(error) {
      if (error.syscall !== ‘listen‘) {
        throw error;
      }
    
      var bind = typeof port === ‘string‘
        ? ‘Pipe ‘ + port
        : ‘Port ‘ + port;
    
      // handle specific listen errors with friendly messages
      switch (error.code) {
        case ‘EACCES‘:
          console.error(bind + ‘ requires elevated privileges‘);
          process.exit(1);
          break;
        case ‘EADDRINUSE‘:
          console.error(bind + ‘ is already in use‘);
          process.exit(1);
          break;
        default:
          throw error;
      }
    }
    
    /**
     * Event listener for HTTP server "listening" event.
     */
    
    function onListening() {
      var addr = server.address();
      var bind = typeof addr === ‘string‘
        ? ‘pipe ‘ + addr
        : ‘port ‘ + addr.port;
      debug(‘Listening on ‘ + bind);
    }

    4.路由功能

    首先在项目目录里创建一个controller即控制层

    在controller下新建index.js 这里面我们简单的返回一个title来进行测试

    exports.index = function (){
        return {title: "欢迎来到我的首页!"};
    };

    接下来我们在路由层里面设置index.js

    var express = require(‘express‘);
    var router = express.Router();
    
    // 引入c层的各个控制器
    var indexController = require("../controller/index");
    
    /* GET index page. */
    router.get(‘/index‘, function(req, res, next) {
      res.render(‘index‘, indexController.index());
    });
    
    module.exports = router;

    然后对V层的index.html模板进行修改

    <!DOCTYPE html>
    <html>
      <head>
        <title><%= title %></title>
        <link rel=‘stylesheet‘ href=‘/css/style.css‘ />
      </head>
      <body>
        <h1><%= title %></h1>
        <p>Welcome to <%= title %></p>
      </body>
    </html>

    这里我们采用的是ejs模板,所以要严格按照ejs的模板规则,当然也可以用其他模版引擎,比如jade等等

    另外我对静态资源目录进行了一些小修改,主要是个人习惯,

    原本的静态资源目录:

    改过后的静态资源目录:

    所以页面引用的时候要稍微注意下,当资源加载的时候,默认从public下查找,所以引用的路径:<link rel=‘stylesheet‘ href=‘/css/style.css‘ />

    一切大功告成,接下来我们可以启动服务,来访问我们的测试页面,终端可以用npm start进行访问,我用的webstorm直接debug就可以看到效果

    可以看到我们可以成功访问页面,并且css也成功加载。

    到这为止,其实一个简单的express的搭建就已经完成,感觉很简单,对不对? 只要整站的架构思维理顺,一切都能迎刃而解!

    5.完整的项目

    接下来我们做一个简单的登录注册,使用MongoDB做为我们的数据库。

    做之前我们先来规划一下思路:

    ①新建两个页面,一个登录页(login.html), 登录成功后的跳转页(home.html)

    ②照葫芦画瓢,按照刚刚的顺序,先跑通这两个页面

    ③写登录和注册的接口,这个时候我们就需要用到数据库了,注册之前先进行查询,数据库里是否有这个用户名,然后是登录,账户与密码是否匹配

    ④前端的注册和登录的功能实现

    大体上就这个思路,让我们来一步步进行。

    1.创建登录页以及登录成功页

    在路由层的index.js里面新增代码:

    var loginController = require("../controller/login");
    
    /* GET login page. */
    router.get(‘/login‘, function(req, res, next) {
      res.render(‘login‘, loginController.login());
    });

    C层的login.js:

    exports.login = function (){
        return {title: "这里是登录页"};
    };

    V层的login.html:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title><%=title%></title>
        <script></script>
        <link rel="stylesheet" href="/css/login.css"/>
    </head>
    <body>
    <h1>~<%=title%>~</h1>
    <form id="myForm">
        帐号:<input type="text" name="username"/><br/><br/>
        密码:<input type="password" name="password"/><br/><br/>
        <input type="button" value="注册" node-type="register" /> &nbsp; <input type="button" value="登录" node-type="submit"/>
    </form>
    <script src="/js/jquery.js"></script>
    <script src="/js/login.js"></script>
    </body>
    </html>

    样式简单的写写就可以啦~

    重启服务,访问login:

    全部OK,接下来是home页面,由于home页是登陆成功页,所以我们做个假的帐号进行测试:

    路由层的index.js添加访问home的方法:

    /* GET home page. */
    router.get(‘/home‘, function(req, res, next) {
      res.render(‘home‘, {
        title: "登录成功页",
        username: "测试帐号"
      });
    });

    V层的home.html:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>恭喜~<%= title %>~恭喜</title>
        <link rel="stylesheet" href="/css/home.css"/>
    </head>
    <body>
    <h1>尊敬的<%= username %>,欢迎您!</h1>
    <a class="logout" href="/logout">退出登录</a>
    </body>
    </html>

    同样样式简单写写就可以了

    重启服务,访问home页:

    可以看到访问成功,这里其实我们应该有一个退出登录的页面,我就不再单写一个页面了,退出登陆后直接跳转到登录页就可以了~~~

    路由层曾加一个访问logout的方法就可以:

    /*GET logout page.*/
    router.get(‘/logout‘, function (req, res){
      res.redirect("/login");
    });

    重启服务后我们点退出登录按钮,可以看到直接跳转到了登录页~

    好了,接下来该实现前端登录注册的功能了,这里先来写登录的功能,我们先来规定下接口的格式:{“code”: 200, “msg”: “登录成功”}

    code等于200的时候,为登录成功,201为登录失败。我们先用get方式来测试页面,跑通页面以后再用post方式提交

    在C层新建getLogin.js:

    var userList = {};
    
    exports.getLogin = function (req, res){
        res.send({
            code:200,
            msg: "登录成功(本条消息来自后台)"
        });
        userList = {
            username: req.param("username")
        }
    };
    
    exports.userList = function (){
        return userList;
    };

    userList用来存储登录时所填写的用户信息(可以理解成一个数据库,从数据库里读取内容)

    在路由层的index.js做如下改动:

    var getLoginController = require("../controller/getLogin");
    
    /* GET home page. */
    router.get(‘/home‘, function (req, res){
      res.render(‘home‘, {
          title: "登录成功页",
          username: getLoginController.userList().username
      });
    });
    
    router.get(‘/userData‘, getLoginController.getLogin);

    userData即前端的接口地址

    现在就可以来写写前端登录的功能了:

    ;(function ($){
        var foo = function (options){
            var self = this;
                self.options = $.extend({
                    parent: $("#myForm"),
                    register: $("[node-type=register]"),
                    submit: $("[node-type=submit]")
                }, options);
            self.bindEvent();
        };
    
        foo.prototype = {
            bindEvent: function (){
                var self = this;
                self.login();
            },
            login: function (){
                var self = this,
                    parent = self.options.parent,
                    submit = self.options.submit;
    
                submit.on("click", function (){
                    var jqXML = $.ajax({
                        url: "/userData",
                        dataType: "json",
                        type: "get",
                        data: parent.serialize()
                    });
    
                    jqXML.done(function (data){
                        if(data.code == 200){
                            location.href = "/home";
                        }
                    });
                });
            }
        };
    
        new foo();
    })(jQuery);

    简单的get提交方式,记得在login.html页面上引用~

    一切OK,重启服务,访问login页面

    输入用户名以后点击登录:

    恭喜!访问成功!

    下一节我们将跟数据库连接起来,做一个真正意义上的登录注册。

     
  • 时间: 2024-12-15 21:10:19

    Node.js(express) + MongoDB(mongoose) 简单开发(一)的相关文章

    Node.js(express) + MongoDB(mongoose) 简单开发(二)

    前面说过,做一个真正意义上的登录注册,接下来就让我们一步一步实现吧~ 首先需要安装mongodb,网上有很多安装教程,这里就不再赘述. 安装完成后开始与本地数据库连接,可以参考这里:MongoDB介绍及下载与安装 最后可以安装一个可视化的操作数据库的软件:MongoVUE,配置也很简单: 最后在项目级目录下安装mongoose,安装过程自行百度~ 安装成功后可在node_modules下看见mongoose文件夹 接下来我们测试数据库是否连同: 新建一个models的文件夹,在这里我们对表进行操

    基于 Node.js + Express + mongoDB + Bootstrap 搭建的电影网站

    电影网站 ?? GitHub: https://github.com/bxm0927/movie-website 此项目是基于 Node.js + Express + mongoDB + Bootstrap 搭建的电影网站. 主要功能模块: 一期:前台电影展示页.电影详情页.后台电影管理中心(电影录入.电影修改) 二期:用户登录注册注销功能.用户识别和持久化.后台用户管理中心(用户录入.用户修改).电影评论 <!-- more --> 图片预览 技术栈 [前端] HTML/CSS/JS:亘古不

    Node.js Express+Mongodb 项目实战

    Node.js Express+Mongodb 项目实战 这是一个简单的商品管理系统的小项目,包含的功能还算挺全的,项目涵盖了登录.注册,图片上传以及对商品进行增.删.查.改等操作,对于新手来说是个很不错的练手项目,分享给大家. GitHub源码:https://github.com/oceanMin/cms 项目前准备 安装node.js 安装express 安装mongoDB 章节目录 快速开始 快速开始 模块 express商品管理系统介绍 框架搭建.ejs .express.static

    Node.js+Express+MongoDB数据库实现网页注册登入功能

    通过 Node.js + Express + MongoDB 实现网页注册账号 和 登入账号的功能 项目准备: 1: 事先准备好项目的页面 (首页页面 index.html)(登入页面 login.html) (注册页面 register.html) 2:    安装好 Node.js 需要使用的第三方模板 3:  设计路径设计 4:  理清功能需求 5:  创建 app.js  router.js   mgdb.js 三个 js 文件  和 public 和 views 文件夹 作用: app

    node.js+express+mongodb

    主要是想用node.js链接mongodb,用的是mongoose.用ejs引擎,扩展到.html比较容易 小例子结构简单,框架清晰. 提交方法 路径 方法 作用 get add     post add   提交记录 get del     get modify   转到修改页面 post modify   修改记录 入口:mongodb.js,数据模型:model.js,(这两个在同一级目录) 路由:mong_ro.js(引入model.js用../) 三个页面index.html,add.

    【我的笔记BLOG1】配置webstorm + node.js +express + mongodb开发博客的环境

    1. 安装webstorm 并破解 2. 安装node (以及express框架) 至官网下载并安装.(http://nodejs.org)v0.10.32   msi 安装后测试,打开命令行, c:\users\Iris804>  node >console.log("hello") 输出 hello undefined 安装node.js 包管理器(Express) ctrl+d, 回到初始窗口,输入  npm install -g express-gengerator

    Node.js + Express + Mongodb 开发搭建个人网站(一)

    一.Node + Express环境搭建 0.去Node官网下载安装node,如果安装了 npm 和 node的话 那么就 安装 全局的 express,-g全局安装 npm install express –g 1.然后使用 express 创建项目,命令:   express 项目名 初始化一个node项目 注意 这里 默认的页面模版 是jade 大部分小项目使用的是 ejs模版,所以 利用express创建ejs模版的node项目,命令为express -e 项目名 express -e

    Node.js + Express + Mongodb 开发搭建个人网站(二)

    二.路由 1.打开 routes/index.js ,这个意思就是  捕获到访问主页的get请求: 并通过 app.js 分配到对应的路由里: 看到这里,打开 http://127.0.0.1:3000/users/  来感受一个路由的意思: routes/index.js 文件: 如果我们请求是get,路径是 '/' 那么就是渲染index.ejs这个视图,可以省略后缀名 .ejs: 这个的意思是将数据传到index.ejs中 并输出到页面上. 2.视图 views/index.ejs 可以看

    ubuntu 安装node.js + express + mongodb

    转载自http://my.oschina.net/reg/blog/289536 Ctrl + Alt + T,打开终端,输入以下命令安装: sudo apt-get install nodejs 安装完成后,终端输入nodejs,就能进入node命令啦: 但是正常下应该是输入node进入命令而不是nodejs: 在Ubuntu下node是属于其他应用的,不过继续输入下面的命令安装,完成后就可以使用node进入命令啦. sudo apt-get install nodejs-legacynode