希望對后來的朋友有幫助,第一期主文件代碼和注釋
我是在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項目地址
2016-10-13
感謝大神!
2017-06-27
第93行 如果根據視頻的話,findById的第一個參數是個id(num類型)
2017-01-12
剛剛學習數據,環沒有弄懂數據怎么錄入,整個視頻好像都沒有涉及怎么建立數據庫,是不是我們自己要把之前的數據建立起來?
2017-01-11
movies: movies
ReferenceError: movies is not defined
? ? at D:\Program Files\nodejs\project\imooc\app.js:34:17
這里報錯,請問題主知道什么問題嗎?
2016-09-26
感謝樓主,根據你提供的代碼,終于找到我出BUG的地方了,不細心啊