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语句,导致响应一直阻塞,所以要改一下,如下所示: