node.js require 的对象 无法访问其方法的问题
时间:2014-6-12 10:54
背景:自定义模块引用
环境:OS: win7
NODE: node v0.10.22
IDE: webStorm 7.0.1
伪代码:
commonS.js (这是一个公共的service,供其他服务调用)
1 var config = require('../config'); 2 var baseDao = require('../dao/baseDao'); 3 var logger = require('../logger'); 4 var mongoose = require('mongoose'); 5 var innSeq = mongoose.model('innerWBSeq'); 6 var async = require('async'); 7 var statusService = require('./statusesS');//注意这里 8 9 10 function CommonService() { 11 this._MAX_ALIVE = 3 * 60 * 60 * 1000; 12 } 13 14 /** 15 * 自增当前序列 16 * @param increase 17 * @param type 18 * @param callback 19 */ 20 CommonService.prototype.inCreaseInnerSeq = function(increase,type,callback){ 21 if(!increase) { 22 increase = 1; 23 } 24 25 if(!type) { 26 //TODO 27 } 28 29 baseDao.update('innerWBSeq',{type: type},{$inc : {'id' : increase}},{'upsert':true},callback); 30 };
31
32 module.exports = new CommonService();
statusesS.js (这是一个service,调用commonS.js中的公共方法)
1 var async = require('async'); 2 var commonService = require('./commonService');//注意这里 3 var baseDao = require('../dao/baseDao'); 4 var utils = require('../lib/utils'); 5 var mongoose = require('mongoose'); 6 7 function StatusesS() { 8 9 } 10 11 /** 12 * xxx 13 * @param params 14 * @param callback 15 */ 16 StatusesS.prototype.xxx= function(params,callback) { 17 var self = this; 18 var curUserInfo = {}; 19 commonService.inCreaseInnerSeq(1,'xx',cb); 20 21 ... 22 23 }; 24 25 module.exports = new StatusesS();
问题描述:不小心在,commonsS.js中引用了statusesS.js,又在statusesS.js中引用了commonsS.js,当我们调用commonsS中的方法时(statusesS.js中第19行),node会告诉我们找不到相应的方法。
D:\IPTV\project2.0\wb-service\node_modules\mongoose\lib\utils.js:419 throw err; ^ TypeError: Object #<Object> has no method 'inCreaseInnerSeq' at Array.StatusesS.insertStatus.async.auto.increaseSeqHandler [as 0] (D:\IPTV\project2.0\wb-service\service\statusesS.js:35:21) at async.auto (D:\IPTV\project2.0\wb-service\node_modules\async\lib\async.js:459:38) at Array.forEach (native) at _each (D:\IPTV\project2.0\wb-service\node_modules\async\lib\async.js:32:24) at Object.async.auto (D:\IPTV\project2.0\wb-service\node_modules\async\lib\async.js:430:9) at StatusesS.insertStatus (D:\IPTV\project2.0\wb-service\service\statusesS.js:33:9) at Server.Statuses.saveTextStatusREST (D:\IPTV\project2.0\wb-service\controller\statuses.js:140:21) at next (D:\IPTV\project2.0\wb-service\node_modules\restify\lib\server.js:731:30) at f (D:\IPTV\project2.0\wb-service\node_modules\restify\node_modules\once\once.js:16:25) at Server.data (D:\IPTV\project2.0\wb-service\api.js:106:10) Process finished with exit code 8
问题分析:这个时候,commonS引用对象是这样的
解决方法:我们需要解除commonS.js中对statusesS的引用,也就是删除commonS.js中第七行代码,这个时候再看引用对象的状态,如下图:
到此,问题解决了。说得有些啰嗦了,其实也是希望自己下次不再犯类似的错误。