[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist

promise主要是用来解决异步回调问题,其实还有好几种比promise更好的方案,后面再说,这节,我们先用promise来改造下,我以前写的一篇文章[js高手之路]javascript腾讯面试题学习封装一个简易的异步队列

中的一道面试题( 页面上有一个按钮,一个ul,点击按钮的时候,每隔1秒钟向ul的后面追加一个li, 一共追加10个,li的内容从0开始技术( 0, 1, 2, ....9 ) ).

promise的小实例:

 1 function next1(){
 2     return new Promise( function( resolve, reject ){
 3         console.log( ‘next1‘ );
 4         resolve( ‘jump to next2‘ );
 5     } );
 6 }
 7
 8 function next2(){
 9     return new Promise( function( resolve, reject ){
10         console.log( ‘next2‘ );
11         resolve( ‘jump to next3‘ );
12     } );
13 }
14
15 next1().then( function( res ){
16     console.log( res );
17     return next2();
18 } ).then( function( res ){
19     console.log( res );
20 } );

使用promise的改造方案:

 1 <input type="button" value="添加">
 2 <ul></ul>
 3 <script>
 4     var oUl = document.querySelector("ul");
 5     var oBtn = document.querySelector("input");
 6     var count = 0;
 7     var timer = null;
 8     function createDom() {
 9         var oLi = document.createElement("li");
10         oLi.innerHTML = count++;
11         oUl.appendChild(oLi);
12     }
13     var addDom = (function () {
14         return new Promise(function (resolve, reject) {
15             resolve(createDom);
16         });
17     })();
18     oBtn.onclick = function () {
19         timer = setInterval(function () {
20             if (count == 10) {
21                 clearInterval(timer);
22             } else {
23                 addDom.then(function (fn) {
24                     fn();
25                 });
26             }
27         }, 1000);
28     }
29 </script>

接下来,我们就用promise结合Node.js+jade+mongodb+mongoose+express来实现一个简单的todolist( 留言板 )

项目结构:

实现的效果:

public: 存放的项目的静态资源,如图片,css,js等

routers: 把不同功能模块分离出不同的路由,如index.js( 首页路由 ), add.js( 发布留言时候的路由 )

views: jade模板目录

db.js: 数据库连接模块

server.js: 启动服务器以及项目入口

server.js:

 1 var express = require(‘express‘);
 2 var app = express();
 3 var path = require( ‘path‘ );
 4 var indexRouter = require( ‘./routers/index.js‘ );
 5 var addRouter = require( ‘./routers/add.js‘ );
 6
 7 app.use( ‘/‘, indexRouter );
 8 app.use( ‘/add‘, addRouter );
 9 app.use( express.static( path.join( __dirname, ‘public‘ ) ) );
10
11 app.set(‘views‘, path.join(__dirname, ‘views‘));
12 app.set(‘view engine‘, ‘jade‘);
13
14 app.listen( 3000 );
15 console.log( ‘server listening on:‘ + 3000 );

index.js,渲染首页,取出数据库中的所有留言数据

 1 var express = require(‘express‘);
 2 var router = express.Router();
 3 var Message = require(‘../db‘);
 4
 5 function getAllMsg(){
 6     return new Promise( function( resolve, reject ){
 7         Message.find( {}, function( err, msgList ){
 8             resolve( msgList );
 9         } );
10     } );
11 }
12 router.get(‘/‘, function (req, res) {
13     getAllMsg().then( function( data ){
14         res.render( ‘index‘, {
15             msgList : data
16         } );
17     } );
18 });
19 module.exports = router;

add.js,处理发布留言的提交流程

 1 var express = require( ‘express‘ );
 2 var router = express.Router();
 3 var Message = require( ‘../db‘ );
 4
 5 function addMsg( msgInfo ){
 6     var msgModel = new Message( msgInfo );
 7     msgModel.save(function(err,result){
 8         if( err ){
 9             console.log( err );
10         }else{
11             console.log( ‘success‘ );
12         }
13     });
14 }
15 router.get(‘/‘, function( req, res ) {
16     addMsg( {
17         title : req.query.msg,
18         listTime : new Date()
19     } );
20     res.redirect( ‘/‘ );
21 });
22
23 module.exports = router;

db.js: 数据库连接模块

 1 var mongoose = require(‘mongoose‘);
 2 mongoose.Promise = global.Promise;
 3 var DB_URL = ‘mongodb://localhost:27017/cms‘;
 4
 5 var db = mongoose.createConnection(DB_URL);
 6 db.on(‘connected‘, function (err) {
 7     if (err) {
 8         console.log(err);
 9     } else {
10         console.log(‘db connected success‘);
11     }
12 });
13 var Schema = mongoose.Schema;
14 var msgSchema = new Schema({
15     title: String, //留言信息
16     listTime: Date //发布时间
17 });
18 var Message = db.model( ‘Message‘, msgSchema );
19
20 module.exports = Message;

后续的功能:

1,删除

2,编辑

3,分页

...等等

时间: 2024-10-12 05:28:57

[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist的相关文章

[js高手之路]Node.js+jade+mongoose实战todolist(分页,ajax编辑,删除)

该系列文章索引: [js高手之路]node js系列课程-创建简易web服务器与文件读写 [js高手之路]node js系列课程-图解express+supervisor+ejs用法 [js高手之路]Node.js实现简易的爬虫-抓取博客所有文章列表信息 [js高手之路]Node.js模板引擎教程-jade速学与实战1-基本用法 [js高手之路]Node.js模板引擎教程-jade速学与实战2-流程控制,转义与非转义 [js高手之路]Node.js模板引擎教程-jade速学与实战3-mixin

[js高手之路]Node.js实现简易的爬虫-抓取博客所有文章列表信息

抓取目标:就是我自己的博客:http://www.cnblogs.com/ghostwu/ 需要实现的功能: 抓取博客所有的文章标题,超链接,文章摘要,发布时间 需要用到的库: node.js自带的http库 第三方库:cheerio,这个库就是用来处理dom节点的,他的用法几乎跟jquery用法一模一样,所以有了这个利器,写一个爬虫就非常简单 准备工作: 1,npm init --yes 初始化package.json 2,安装cheerio:npm install cheerio --sav

[js高手之路]Node.js模板引擎教程-jade速学与实战2-流程控制,转义与非转义

一.转义与非转义 jade模板文件代码: 1 doctype html 2 html 3 head 4 meta(charset='utf-8') 5 title jade学习-by ghostwu 6 body 7 h3 转义与非转义 8 - var userName = 'ghostwu' 9 - var str = '<script>alert("ghostwu");</script>' 10 div #{userName} 11 div #{str} 1

[js高手之路]node js系列课程-创建简易web服务器与文件读写

web服务器至少有以下几个特点: 1.24小时不停止的工作,也就是说这个进程要常驻在内存中 2.24小时在某一端口监听,如: http://localhost:8080, www服务器默认端口80 3.要能够处理基本的请求:如get, post 在node js中创建一台服务器非常的简单,因为node自带http模块,该模块可以帮助我们非常快速搭建一台web服务器,来处理一个简单的请求. 1 const http = require("http"); 2 var server = ht

[js高手之路]Node.js模板引擎教程-jade速学与实战4-模板引用,继承,插件使用

一.block 模块复用 把需要复用的模块用block定义 block后面跟上模块的名字,引用一次block 内容就会被复用一次 编译之后的结果: 二,继承模板(extends) 在实际开发中,网站的头部,尾部一般都是公用的,我们可以通过jade的模板继承( extends ) 功能,把公共部分抽象出来,然后让不同的页面继承这些公共部分, 而且继承过来之后还可以重写 新建一个layout.jade模板 这是一个公共的模板,如果我们的首页需要这个公共模板,同时首页需要修改这个公共模板的布局部分(

[js高手之路]Node.js模板引擎教程-jade速学与实战1

环境准备: 全局安装jade: npm install jade -g 初始化项目package.json: npm init --yes 安装完成之后,可以使用 jade --help 查看jade的命令行用法 一.在项目目录下新建index.jade文件 inde.jade代码: 1 doctype html 2 html 3 head 4 meta(charset='utf-8') 5 title 6 body 7 h3 欢迎学习jade 语法规则: 1, 标签按照html的缩进格式写 2

[js高手之路]Node.js模板引擎教程-jade速学与实战3-mixin

强大的mixin mixin类似于函数的功能,可以达到模块复用的效果 mixin show: 定义一个类似函数的功能,名字叫show,里面的就是他的内容 +show: 调用show,每调用一次执行一次里面的内容 编译之后的结果: mixin也可以传递参数 编译之后的结果: mixin支持嵌套调用 编译之后的结果: mixin支持传递模块 编译之后的结果: mixin还可以传递属性 编译之后的结果: mixin支持传递不定参数 编译之后

[js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)

关于promise我在之前的文章已经应用过好几次,如[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist,本文就来讲解下promise的常见用法. 为什么会有promise,他的作用是什么? promise主要是为了解决js中多个异步回调难以维护和控制的问题. 什么是promise? 从图中,我们可以看出,Promise是一个函数,这个函数上有在项目中常用的静态方法:all, race, reject,resolve等,原

node.js高级编程|node.js 视频教程_基于node.js+Express.js+Jade+MongoDB实战开发

基于node.js+Express.js+Jade+MongoDB开发Web即时聊天系统课程讲师:幻星课程分类:前端开发适合人群:初级课时数量:36课时更新程度:完成用到技术:Node.js NPM. Express.NoSQL,MongoDB涉及项目:匿名聊天网站系统node.js视频教程:http://www.ibeifeng.com/goods-462.htmlnode.js 教程适合人群:node.js视频教程要求学员了解JavaScript,node.js入门教程适合希望更深入的学习N