您的位置:首页 > Web前端 > Node.js

node.js require 的对象 无法访问其方法的问题

2014-06-12 11:27 211 查看
时间:2014-6-12 10:54

背景:自定义模块引用

环境:OS: win7

NODE: node v0.10.22

IDE: webStorm 7.0.1

伪代码:

   commonS.js (这是一个公共的service,供其他服务调用)

var config = require('../config');
var baseDao = require('../dao/baseDao');
var logger = require('../logger');
var mongoose = require('mongoose');
var innSeq = mongoose.model('innerWBSeq');
var async = require('async');
var statusService = require('./statusesS');//注意这里

function CommonService() {
this._MAX_ALIVE = 3 * 60 * 60 * 1000;
}

/**
* 自增当前序列
* @param increase
* @param type
* @param callback
*/
CommonService.prototype.inCreaseInnerSeq = function(increase,type,callback){
if(!increase) {
increase = 1;
}

if(!type) {
//TODO
}

baseDao.update('innerWBSeq',{type: type},{$inc : {'id' : increase}},{'upsert':true},callback);
};

module.exports = new CommonService();


statusesS.js (这是一个service,调用commonS.js中的公共方法)

var async = require('async');
var commonService = require('./commonService');//注意这里
var baseDao = require('../dao/baseDao');
var utils = require('../lib/utils');
var mongoose = require('mongoose');

function StatusesS() {

}

/**
* xxx
* @param params
* @param callback
*/
StatusesS.prototype.xxx= function(params,callback) {
var self = this;
var curUserInfo = {};
commonService.inCreaseInnerSeq(1,'xx',cb);

...

};

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中第七行代码,这个时候再看引用对象的状态,如下图:



到此,问题解决了。说得有些啰嗦了,其实也是希望自己下次不再犯类似的错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐