zoukankan      html  css  js  c++  java
  • 【转载】nodejs+express+ejs+mongoose实例

    nodejs学得异常痛苦,在这里将学的东西做一番整理,算是自我安慰吧。根据网上todo示例,用express和mongoose重写了部分代码,主要是业务逻辑这块(CRUD),这个没什么难度。目前尚未解决的问题是:express不能使用ejs layout template,查了好久也没解决,知道的麻烦告诉我一下。

    一、代码目录

    二、第三方模块

    1、express

    (1)express中文入门指引手册

    (2)nodejs中文电子书

    (3)如何在WebStorm中建立express工程?

     安装express

    npm install express

    安装成功后在node_modules下会找到express目录,同时也会找到.bin目录,它里面有express命令脚本

    在终端下执行

    express project_name

    project_name为实际的nodejs工程名/路径 比如笔者:E:/Nodejs/todo

    (4)Express官方文档

    2、ejs

    EJS快速入门教程

    3、mongoose

    mongoose2.7.0文档

    Mongoose-让NodeJS更容易操作Mongodb数据库

    三、核心介绍

    1、使用mongoose写的dao(CRUD)

    复制代码
    var util = require('util'); var mongoose = require('mongoose'); var Schema = mongoose.Schema;  var dburl = require("../config").db;//数据库地址  exports.connect = function(callback) {     mongoose.connect(dburl); }  exports.disconnect = function(callback) {     mongoose.disconnect(callback); }  exports.setup = function(callback) { callback(null); }  //定义todo对象模型 var TodoScheme = new Schema({     title:String     ,finished:{type:Boolean,default:false}      ,post_date:{type:Date,default:Date.now} });  //访问todo对象模型 mongoose.model('Todo', TodoScheme); var Todo = mongoose.model('Todo');  //exports.emptyNote = { "_id": "", author: "", note: "" };  exports.add = function(title,callback) {     var newTodo = new Todo();     newTodo.title = title;     newTodo.save(function(err){         if(err){             util.log("FATAL"+err);             callback(err);         }else{             callback(null);         }     });  }  exports.delete = function(id, callback) {     exports.findTodoById(id, function(err, doc) {         if (err)             callback(err);         else {             util.log(util.inspect(doc));             doc.remove();             callback(null);         }     }); }  exports.editTitle = function(id, title, callback) {     exports.findTodoById(id, function(err, doc) {         if (err)             callback(err);         else {             doc.post_date = new Date();             doc.title = title;             doc.save(function(err) {                 if (err) {                     util.log('FATAL '+ err);                     callback(err);                 } else                     callback(null);             });         }     }); } exports.editFinished = function(id, finished, callback) {     exports.findTodoById(id, function(err, doc) {         if (err)             callback(err);         else {             doc.post_date = new Date();             doc.finished = finished;             doc.save(function(err) {                 if (err) {                     util.log('FATAL '+ err);                     callback(err);                 } else                     callback(null);             });         }     }); }  exports.allTodos = function(callback) {     Todo.find({}, callback); }  exports.forAll = function(doEach, done) {     Todo.find({}, function(err, docs) {         if (err) {             util.log('FATAL '+ err);             done(err, null);         }         docs.forEach(function(doc) {             doEach(null, doc);         });         done(null);     }); }  var findTodoById = exports.findTodoById = function(id,callback){     Todo.findOne({_id:id},function(err,doc){         if (err) {             util.log('FATAL '+ err);             callback(err, null);         }         callback(null, doc);     }); }
    复制代码

    2、url路由控制

    复制代码
    "use strict";  var config = require('../config'); var db = require('../dao/todoDao');  exports.index = function (req, res, next) {     db.allTodos(function (err, todos) {         if (err) {             return next(err);         }         res.render('index.html', {todos: todos});     }); };  exports.new = function (req, res, next) {     var title = req.body.title || '';     title = title.trim();     if (!title) {         return res.render('error.html', {message: '标题是必须的'});     }     db.add(title, function (err, row) {         if (err) {             return next(err);         }         res.redirect('/');     }); };  exports.view = function (req, res, next) {     res.redirect('/'); };  exports.edit = function (req, res, next) {     var id = req.params.id;     db.findTodoById(id, function (err, row) {         if (err) {             return next(err);         }         if (!row) {             return next();         }         res.render('todo/edit.html', {todo: row});     }); };  exports.save = function (req, res, next) {     var id = req.params.id;     var title = req.body.title || '';     title = title.trim();     if (!title) {         return res.render('error.html', {message: '标题是必须的'});     }     db.editTitle(id,title,function (err, result) {         if (err) {             return next(err);         }         res.redirect('/');     }); };  exports.delete = function (req, res, next) {     var id = req.params.id;     db.delete(id, function (err) {         if (err) {             return next(err);         }         res.redirect('/');     }); };  exports.finish = function (req, res, next) {     var finished = req.query.status === 'yes' ? true : false;     var id = req.params.id;     db.editFinished(id,finished, function (err, result) {         if (err) {             return next(err);         }         res.redirect('/');     }); };
    复制代码

    3、使用express框架

    复制代码
    var express = require('express')   , todo = require('./controllers/todo')   , http = require('http')   , config = require("./config")   , todoDao = require("./dao/todoDao");   var app = express();  app.engine('html', require('ejs').renderFile);  app.configure(function(){    app.set('port', config.port);   app.set('view engine', 'ejs');   app.set('views', __dirname + '/views');    app.use(express.logger('dev'));   app.use(express.bodyParser());   app.use(express.methodOverride());   app.use(app.router);   app.use(express.static(__dirname + '/public'));  });    app.configure('development', function(){   app.use(express.errorHandler()); });  //url路由 app.get('/', todo.index); app.post('/todo/new', todo.new); app.get('/todo/:id', todo.view); app.get('/todo/:id/edit', todo.edit); app.post('/todo/:id/edit', todo.save); app.get('/todo/:id/delete', todo.delete); app.get('/todo/:id/finish', todo.finish);  todoDao.connect(function(error){     if (error) throw error; }); app.on('close', function(errno) {     todoDao.disconnect(function(err) { }); });  http.createServer(app).listen(app.get('port'), function(){   console.log("Express server listening on port " + app.get('port')); });
    复制代码

    注意点:为了在ejs中能使用.html,以下这句是关键,app.register()不能用了

    app.engine('html', require('ejs').renderFile);

    困惑点:如何在express中使用ejs的layout模板,具体是怎么设置的?!知道的麻烦说一下,谢谢~~~

    四、源码

    程序员不是求源码,就是求无码。

    todo源码

    标签: nodejsmongooseexpressejs
    « 博主前一篇:node.js结合mongodb
    posted on 2012-07-22 18:28 像少年啦飞驰 阅读(941) 评论(2编辑 收藏
    发表评论
    #1楼 2012-09-17 15:36 | 淡漠的茶  
    var ejs=require('ejs');
    app.register('html', ejs); //同时支持html的设置
    app.set('view engine', 'ejs');//同时支持ejs
    //app.set('view engine', {layout:false});//如果仅支持html 开启这个

    默认layout.ejs
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title><%= titleitle %></title>
    </head>
    <body>
    <!-- 局部引入 -->
    <%- partial('header.ejs') %>
    <!-- 主体-->
    <%- body %>
    </body>
    </html>

    index.ejs
    <div><%= title %></div>

    指定layout 比如 master.ejs
    exports.index = function(req, res){
    res.render('index', {title:'express',layout:''master});
    };
  • 相关阅读:
    【转】VS2010中 C++创建DLL图解
    [转]error: 'retainCount' is unavailable: not available in automatic reference counting mode
    [转]关于NSAutoreleasePool' is unavailable: not available in automatic reference counting mode的解决方法
    【转】 Tomcat v7.0 Server at localhost was unable to start within 45
    【转】Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If
    【转】SVN管理多个项目版本库
    【转】eclipse安装SVN插件的两种方法
    【转】MYSQL启用日志,和查看日志
    【转】Repository has not been enabled to accept revision propchanges
    【转】SVN库的迁移
  • 原文地址:https://www.cnblogs.com/fx2008/p/2750009.html
Copyright © 2011-2022 走看看