TypeError [ERR_INVALID_CALLBACK]: Callback must be a function錯誤解決

       在《oAuth2實戰》一書中,作者隨書代碼使用了node.js語言來描述。在oAuth中有4種角色:資源擁有者、客戶端、授權服務器和受保護資源,資源擁有者就是人,所以每個場景練習都是三個組件,換成node.js即三個js文件,在三個窗口依次啓動client.js、authorizationServer.js、protectedResource.js,當啓動完以後,首先點擊getOAuthToken,拿到令牌以後,點擊getProtectedResource報錯了,受保護資源端錯誤如下所示:

      client端錯誤如下所示:

       在網上搜索解決方案,說是代碼中用的node.js版本與自己本地安裝的node.js版本不一致,並且自己本地的node.js版本更新,新舊版本node.js在這個錯誤的區別主要在於fs這個庫的api有變化,新版本的fs操作,函數中都要求有一個回調函數,而老版本中沒有,這個庫如下:

       具體到這個隨書代碼中,表現爲代碼中使用了nosql內存存儲組件,而nosql組件中又操作了fs庫,從報錯中也可以看出是項目依賴node_modules\nosql\index.js 2388:8出了問題,再加上圖一中錯誤第二行顯示at Object.close,證明是在調用fs.close函數時因爲缺少回調函數報的錯,找到node_modules\nosql\index.js 2388:8,如下所示:

       在fs.close函數中加了回調函數以後,重新啓動項目,getProtectedResource就正常返回了,所以這個錯誤有兩種解決方式:一是降低node.js版本;二是向上面圖中一樣爲報錯的函數加一個回調函數。第二種方法的弊端就是每次編譯完都得改,而且隨書代碼都是獨立成章的,每導入一個章節的練習就得改一次,特麻煩。

       另外這本書聯繫過程中還有一個bug就是:代碼中包含了正常情況下的返回,也包含了異常情況下的返回,但是異常情況下的返回忘了加end語句,導致響應一直阻塞,所以要改一下,如下所示:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章