为了账号安全,请及时绑定邮箱和手机立即绑定

希望对后来的朋友有帮助,第一期主文件代码和注释

我是在2016-9-19号完成第一期内容的,本期的所有功能已经通过测试。

建议刚接手node的朋友,最好看一下node权威指南这本书(中文的),掌阅有此书。

建议看看mongoose的文档,这能理解该视频中对数据模型和数据静态方法的编写

建议大家一定要安装和初步使用mongodb,这个很重要

一定要小心jade,很多时候会卡在jade某个地方的拼写错误导致数据读取失败。

下面是我的app.js文件,希望对刚来的小伙伴有用吧

// express node应用搭建模块
var express = require('express');

// 加载表单序列化模块
var bodyParser = require('body-parser');
// parse application/x-www-form-urlencoded
// 这里如果不用app.use(),就需要在post请求中加入该模块作为数据处理中间件
// app.post(请求路径,中间件,回调函数)
// var urlencoded = bodyParser.urlencoded({ extended: true });
// app.post('/admin/movie/new', urlencoded, function(req, res){});

// 加载mongoDB数据处理模块
var mongoose = require('mongoose');

// 加载mongoDB数据模型集
var Movie = require('./models/movie');

// 加载函数库
// Underscor.js定义了一个下划线(_)对象,类似jquery的$
// 函数库的所有方法都属于这个对象。这些方法大致上可以分成:
// 集合(collection)、数组(array)、函数(function)、
// 对象(object)和工具(utility)五大类
// 说白了就是一个对以上数据有强大处理能力的模块
var _ = require('underscore');


// 加载路径处理模块
// 该模块能规范的输出模块路径
// 这里主要是兼容多服务端的路径访问
// 没有此模块也能正常运行
var path = require('path');

// 端口设置
// process.env.PORT 这里是指Node环境中默认的端口
var port = process.env.PORT || 3000;

// 创建服务应用实例
var app = express();

// 连接数据库
// 这里需要安装Mongodb,并且要启动mongodb服务
mongoose.connect('mongodb://127.0.0.1:27017/imovie');

// 设置视图路径
app.set('views','./views/pages');
// 设置模板引擎为jade
app.set('view engine','jade');

// express4版本内置的静态资源读取express.static()
// 指定读取静态资源的路径为public文件夹
// 这里主要是加载bootstrap中的 css js)
// __dirname变量获取当前模块文件所在目录的完整绝对路径
// app.use()是干啥的呢?
// app.use 加载用于处理http請求的middleware(中间件),
// 当一个请求来的时候,会依次被这些 middlewares处理
app.use( express.static( path.join(__dirname, 'public') ) );

app.use(bodyParser.urlencoded({ extended: true }));

// 加载时间处理模块
// app.locals对象字面量中定义的键值对,
// 是可以直接在模板中使用的,
// 就和res.render时开发者传入的模板渲染参数一样
// 这里是指可以在模板中使用moment方法
// 在list.jade中我们需要将数据中的时间转换成mm/dd/yyyy
// 那么就需要用到moment,所以这里是为了将该方法能传入到模板中
// 这里如果换成app.locals.dateFun = require('moment');
// 在list模板中我们就需要 #{dateFun(xxxxx).format(MM/DD/YYYY)}
app.locals.moment = require('moment');


// 加载index page并指定访问路径
app.get('/',function(req,res){
  Movie.fetch(function(err,movies){
    if(err) {
      console.log(err);
    }

    res.render('index', {
      title : 'Imovie 首页',
      movies: movies
    });
  });
});

// 加载detail page
//访问路径就是localhost :3000/movie/id 
app.get('/movie/:id',function(req,res){
  
// req.params 获取路径变量值,这里指id这个变量
  var id = req.params.id;

  Movie.findById({_id:id}, function(err,movie) {
    res.render('detail',{
      title:'Imovie'+movie.title,
      movie: movie
    });
  });

});


// 加载admin page
app.get('/admin/movie',function(req,res){
  res.render('admin',{
    title:'Imovie录入',
    movie: {
      title: '',
      doctor: '',
      country: '',
      poster: '',
      language: '',
      flash:'',
      summary: '',
      year: ''
    }
  });
});


//admin uodate movie
app.get('/admin/update/:id',function(req,res){
  
  var id = req.params.id;
  if(id){
    Movie.findById(id,function(err,movie){
      res.render('admin',{
        title: 'Imovie更新',
        movie: movie
      }); 
    });
  }
  
});


//admin post movie  urlencoded, 
app.post('/admin/movie/new', function(req, res) {
   
  if(!req.body) return res.sendStatus(400);
 
  var id = req.body.movie._id;
  var movieObj = req.body.movie;
  var _movie;
  
  if( id != 'undefined' && id != '' ) {

    console.log('take hello');
    console.log(id);

    Movie.findById(id, function(err,movie) {
      if(err){
        console.log(err);
      }
      _movie = _.extend(movie, movieObj);
      _movie.save(function(err, _movie) {
        if(err){
          console.log(err);
        }
        res.redirect('/movie/'+_movie._id);
      });
    });

  }else{

    _movie = new Movie({
      title: movieObj.title,
      doctor: movieObj.doctor,
      country: movieObj.country,
      language: movieObj.language,
      poster: movieObj.poster,
      flash: movieObj.flash,
      year: movieObj.year,
      summary: movieObj.summary
    });
    _movie.save(function(err,movie){
      if(err){
        console.log(err);
      }
      res.redirect('/movie/'+movie._id);
    });

  }
  

});


// 加载list page
app.get('/admin/list',function(req,res){
  Movie.fetch(function(err,movies){
    if(err){
      console.log(err);
    }
    res.render('list',{
      title : 'Imove列表',
      movies: movies,
    });
  });
});


// 接收删除请求
app.delete('/admin/list',function(req, res) {
  // req.query 主要获取到客户端提交过来的键值对
  // '/admin/list?id=12',这里就会获取到12
  var id = req.query.id;
  console.log(id);

  if(id) {
    Movie.remove({_id: id}, function(err) {
      if( err ) {
        console.log(err);
      }else{
        res.json({success: 1});
      }
    });
  }

});

// 监听端口
app.listen(port);
console.log('imovie started on port:' +port);

其他文件可以看我的github项目地址


正在回答

5 回答

感谢大神!

0 回复 有任何疑惑可以回复我~
#1

慕函数6472736 提问者

这是鼓励我要当大神啦,我要加油!!
2016-10-17 回复 有任何疑惑可以回复我~

第93行 如果根据视频的话,findById的第一个参数是个id(num类型)

Movie.findById(id,function(err,movie){


0 回复 有任何疑惑可以回复我~

刚刚学习数据,环没有弄懂数据怎么录入,整个视频好像都没有涉及怎么建立数据库,是不是我们自己要把之前的数据建立起来?

0 回复 有任何疑惑可以回复我~
#1

慕函数6472736 提问者

建议看看mongodb的简单操作,如果你对mysql熟悉或者使用过,那你就明白这里数据库是如何建立的。还有就是mongoose的使用要了解一下,这样你就会比较清楚该项目是如何操作数据的。 该项目里是使用mongoose模块来创建数据库和数据集的,所以不需要特地单独使用mongodb来建立数据库
2017-01-15 回复 有任何疑惑可以回复我~
#2

慕函数6472736 提问者

其实视频里有数据库建立和录入,只是没有特意讲解,建议你可以看看mongodb和mongoose的基础视频,这样有助于填坑
2017-01-15 回复 有任何疑惑可以回复我~

movies: movies

ReferenceError: movies is not defined

    at D:\Program Files\nodejs\project\imooc\app.js:34:17

这里报错,请问题主知道什么问题吗?

0 回复 有任何疑惑可以回复我~
#1

慕函数6472736 提问者

有没有具体的代码呢?出错行的代码是怎么样的? 个人感觉这里可能是读取数据出错, 建议在刚开始时对涉及数据读取的每一步都最好能做一个简单的代码测试,防止代码写复杂后不好发现错误,保证前后的基础数据畅通这个有利于后面的深入数据操作,一般来说写nodejs出错比较少,容易出错且不易发现的地方在于jade文件格式错误导致表单数据提交出错,这也就可能连锁导致数据库读取出错,还有就是jade里的的表达式也容易导致出错,如果这些都没有问题,那就可能是表单序列化出错,如果是序列化的问题,建议后台打印出提交的数据或获取到的数据看是否有问题
2017-01-11 回复 有任何疑惑可以回复我~
#2

慕函数6472736 提问者

嗯,我猜你的是获取主页get(/)时得不到电影数据,你检查一下你的mongoose操作文件,应该是这里面出了问题,建议你单独通过movie这个数据模版来录入数据,看录入数据是否正常,让后再读取数据看能不能读取出数据,你应该是数据操作有地方出错了
2017-01-11 回复 有任何疑惑可以回复我~

感谢楼主,根据你提供的代码,终于找到我出BUG的地方了,不细心啊

0 回复 有任何疑惑可以回复我~
#1

慕函数6472736 提问者

若对你有帮助,我就很高兴!
2016-10-17 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
node+mongodb 建站攻略(一期)
  • 参与学习       91820    人
  • 解答问题       921    个

带你完整实现一个从前端到后端的项目,初中级前端开发工程师必学课程

进入课程

希望对后来的朋友有帮助,第一期主文件代码和注释

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号