關于 Cannot read property '_id' of undefined 和 _movie.save of undefined 報錯問題,個人已解決
第一個問題:Cannot read property '_id' of undefined
分析:
??? form表單在提交時采用的是 enctype="multipart/form-data" 二進制編碼的方式傳遞參數,請求體見【圖一】
而我在其它項目使用post提交時是【圖二】這種 "鍵":"值" 對數據關系。
解決:
??? 所以刪除form表單中的二進制編碼,在cmd中可以看到獲取的_id值(我在/admin/movie 路由中傳遞了 "_id": "1"的值)
第二個問題:_movie.save of undefined
分析:
????????一看到這個報錯時,我就去查了nodejs的官方文檔,去找save方法,結果是 沒寫錯
????????然后就向上找,打印了相關的數據,為
????????console.log("這是前臺傳遞的表單數據:"?+?movieObj);??//req.body.movie?值為?[object?object]?正常 ????????console.log("這是underscore.js中extend()方法執行后movie的值:"?+?movie);????//值為?undefined?不正常
????????這時,問題就出現在
????????_.extend(movie,?movieObj)
????????然后去查找 underscore.js 中 extend方法的解釋
???????_.extend(destination,?*sources)???????? ??復制source對象中的所有屬性覆蓋到destination對象上,并且返回?destination?對象. ??復制是按順序的,?所以后面的對象屬性會把前面的對象屬性覆蓋掉(如果有重復).
????????明白了該方法后打印了 通過findById()方法查詢數據庫出來的movie的值
????????console.log("這是從數據庫通過id查找出來的數據:"?+?movie);????//值為?undefined
???????
????????這時第二個問題的癥結揪出來了
????????在extend()方法中 movie 為 destination,前臺傳遞的參數 movieObj 為 sources。而現在通過查詢id獲取的 movie= undefined
,所以 _movie的值為undefined,才會出現 _movie.save of undefined。
????????那么,在這時就需要去思考 if( id !== "undefined") 這個判定條件是不是出錯了!
????????因為,我們需要在數據庫有該電影字段(通過查詢id值)時去更新數據;在沒有該電影數據時去完整插入該數據。
?所以這時,我在數據庫中手動插入了一條數據。
第一步:通過list電影列表頁進入該電影修改頁面,提交參數。這時,代碼的確走了 if 為true時的代碼塊
第二步:新增一條數據時,提交參數,這時,代碼沒有走else 下的代碼塊,而是走了條件為true的 _.extend()的更新數據
原因: if 的判定條件有問題
解決:
????修改 if( id !== 'undefined') 為 if (id != '')
??? 程序運行正常
??
2016-05-13
問題:再次出現一個錯誤!電影錄入時若 片源地址 中傳入的數據不正常,服務器掛載
在電影錄入頁中,片源地址若傳遞的參數為空時,數據正常存儲到數據庫,并跳轉到/movie/:id 電影的詳情頁
若片源地址(movie[flash])傳遞的參數為非URL格式,數據可以存儲到數據庫
程序執行了一次,即POST下打印出來的2條信息,隨后就執行res.render加載detail.jade模板,但是隨后又執行了一次
但是此時會進入 detail頁,頁面渲染數據都正常,但是服務器掛了
2016-05-13
后期補錄一下,不需要更改 判定條件