设为首页 收藏本站
查看: 1486|回复: 0

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

[复制链接]

尚未签到

发表于 2017-12-15 06:17:10 | 显示全部楼层 |阅读模式
  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( 留言板 )
  项目结构:
DSC0000.png

  实现的效果:
DSC0001.png

  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        >  
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    >  
16     listTime: Date //发布时间
  
17 });
  
18 var Message = db.model( 'Message', msgSchema );
  
19
  
20 module.exports = Message;
  

  后续的功能:
  1,删除
  2,编辑
  3,分页
  ...等等

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-424215-1-1.html 上篇帖子: .NET平台下使用MongoDB入门教程 下篇帖子: MongoDB 3.4分片【Linux】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表