莫名的_locals属性
- 莫名多出個_locals屬性
- reqbody
- data中的_locals
- 問題還是沒有解決
- 問題的原因
莫名多出個_locals屬性
req.body
今天使用express做一個圖書管理項目練習時,發現對req.body得到的數據,進行遍歷賦值的時候,莫名多出來一個_locals屬性,值是一個空對象。通過console.log將req.body打印出來卻又沒有這一項。
使用 hasOwnProperty 進行判斷,結果拋出異常 xxx.hasOwnProperty is not a function,打印其原型__proto__,得到的卻是undefined,一系列事情實在令人費解。
// 修改圖書信息exports.editBook = (req, res) => {let book = req.body;// console.log(book);// console.log(book.__proto__);for(let i = 0; i < data.length; i++){if(data[i].bookId == book.bookId){for(let k in book){// if(book.hasOwnProperty(k))// console.log(k,book[k])data[i][k] = book[k];}break;};}writeDataToFile(res);}想盡各種方法,就是找不到_locals這個屬性在哪。
雖然想出了一個解決辦法,但是卻是避開了遍歷req.body數據,而用另一個期望數據來代替的方法。
// 修改圖書信息exports.editBook = (req, res) => {let book = req.body;for(let i = 0; i < data.length; i++){if(data[i].bookId == book.bookId){for(let k in data[i]){ // 遍歷data[i]而不是book中的鍵data[i][k] = book[k];}break;};}writeDataToFile(res);}這樣確實是解決了會多出一個_locals屬性的問題,但是還是沒解決我的疑惑,這個_locals屬性到底是怎么來的?
網上找到了一個可以在chrome瀏覽器中調試node的方法,使用node-inspector來實現瀏覽器端調試node。
【技巧】斷點調試你的express項目
然后在調試過程中終于發現了,原來不是req.body中有_locals屬性,而是不知道什么原因,在data對應的那個數據中添加了_locals屬性。
由此又引起了我的疑惑:
還是之前沒解決的問題,只是從原來的目標req.body變成了data
如果能了解到第一個問題的答案,也許這個問題也能解決吧。
原本以為這個屬性是req.body加上的,自然是沒有這個疑問,但是既然這個屬性是在data[i]里面,那么用遍歷data[i]得到的鍵名k,通過book(req.body)給data[i]的屬性賦值,應該是不會清除掉data[i]._locals這一項的才對。
data中的_locals
帶著疑惑,把代碼修改一下后再次調試查看一下。
// 修改圖書信息exports.editBook = (req, res) => {let book = req.body;for(let i = 0; i < data.length; i++){if(data[i].bookId == book.bookId){for(let k in data[i]){ // 遍歷data[i]而不是book中的鍵data[i][k] = book[k];}break;};}writeDataToFile(res);}可以看到依然是剛進入方法對應要修改的data數據就有了_locals屬性。
進入循環之后可以發現,遍歷data[i]的時候確實有一個_locals被遍歷出來了,只是因為book對象中沒有該屬性,所以data[i][‘_locals’]被重新賦值為undefined。
但是至此data數據中還是應該存在著_locas這個屬性才對,
事實上,也確實是,在執行完畢editBook方法之后,確實顯示_locals屬性還是存在的,為什么在最后的文件中卻沒有出現這一項,我只能猜測是之后在其他一些依賴或框架的某個方法將這個undefined的值給清除掉了。
問題還是沒有解決
最終問題還是沒有徹底解決,沒有完全搞明白,暫時先放一下吧,也不知道以后能不能弄清楚了。
問題的原因
data 數據原本是通過require(‘./data.json’)引入的,修改代碼成為文件讀取得到數據的形式,發現不會出現 _locals屬性了。
let data = fs.readFileSync(path.join(__dirname, 'data.json'));data = JSON.parse(data);之前調試的時候,會直接在修改的數據中添加一項 _locals屬性,而現在修改了獲取數據的方式之后,很明顯的看到,莫名多出來的_locals屬性不見了。
這里做一個猜測:require()是用來引入其他模塊的,一般都是一個js文件,提供一個接口對象或方法,而在data.json文件中并沒有這樣的接口,是直接的json數據,所以不應該使用require()來引入。
轉載于:https://www.cnblogs.com/wayowe/p/7779560.html
總結
以上是生活随笔為你收集整理的莫名的_locals属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kafka的topic命名技巧
- 下一篇: mongodb配置windows服务启动