2014-04-15 55 views
0

我在節點中編寫了一個簡單的應用程序,但在引用不同模塊的對象時遇到了問題。對象的構造函數和方法(我跳過一些方法來保持摘錄短):類型對象不在node.js中的模塊中返回值

function Account (name, password) { 
    this._name = name; 
    this._password = password; 
    this._attributes = []; 
} 
Account.prototype.load = function (id) { 
    var self = this; 
    self = db.loadObject(id, 'account'); // separate module to save/retrieve data 
    this._name = self._name; 
    this._password = self._password; 
    this._attributes = self._attributes; 
    return this; 
}; 
Account.prototype.getAttributes = function() { 
    return this._attributes; 
} 
Account.prototype.addAttributes = function (a) { 
    this._attributes.push(a); 
}; 
module.exports = Account; 

的DB模塊是在這一點上沒有任何幻想:

var fs = require('fs'); 
var paths = { 
    'account' : './data/accounts/' 
}; 
function loadObject (name, type) { 
    var filePath = paths[type] + name + '.json'; 
    if (!fs.existsSync(filePath)) { 
    return false; 
    } 
    return JSON.parse(fs.readFileSync(filePath, 'utf8')); 
}; 
function saveObject (object, type) { 
    fs.writeFileSync(paths[type] + object.getName() + '.json', JSON.stringify(object),'utf8'); 
}; 
exports.loadObject = loadObject; 
exports.saveObject = saveObject; 

將文件保存爲:

{"_name":"John","_password":"1234","_attributes":[["Jane","sub",[[10,1]]]]} 

在我的來電顯示模塊,我嘗試檢索屬性:

var Account = require('./account.js'); 
var account = new Account(); 
... 
account.load(name); 
... 
var attr = account.getAttributes(); 
for (var item in attr) { 
    console.log(item[0]); 
}; 
... 

在上面的代碼中,最後一個循環打印未定義的對象。我已經檢查過這些文件,信息已經保存並且沒有任何問題。數組attr不是空的。如果我和打印: util.log(typeof attr+': '+attr); 我得到: object: Jane,sub,10,1

實例問題?我是否應該通過account.attributes重寫要直接訪問的_attributes?

+1

沒有什麼,在我跳爲明顯不正確。但是,如果'db.loadObject(id,'account');'以某種異步方式工作,它可以解釋你得到的結果。 (數據庫操作通常是異步的。)您能否將其代碼添加到您的問題中,或者如果您使用的是第三方庫,請提供該庫文檔的鏈接? – Louis

+0

'load'方法是否做異步?所以對'this._name'的賦值都是未定義的,因爲'db.loadObject'返回一個promise或其他東西? –

+1

var self = this;'很混亂。它應該是'var self = db。...' – Bergi

回答

1

這是你目前擁有的代碼,用於輸出數據:

var attr = account.getAttributes(); 
for (var item in attr) { 
    console.log(item[0]); 
}; 

這段代碼的作用是輸出到控制檯在_attributes場每個鍵的第一個字符。使用您在問題中顯示的數據,輸出結果爲0,因爲您的_attributes字段的值爲:[["Jane","sub",[[10,1]]]]。當在var item in attr中使用時,item變量將只獲得一個值,字符串"0"item[0]也將計算爲字符串"0"。實際上,我已將代碼和數據剪切並粘貼到文件中,並運行代碼來仔細檢查,這確實是我運行代碼時得到的結果。我沒有得到未定義的值。一個更明智的方式來擺脫數組的值是:

var attr = account.getAttributes(); 
for (var item in attr) { 
    console.log(attr[item]); 
} 

如果你想要遍歷深兩個層次:

for (var item in attr) { 
    var value = attr[item]; 
    for (var item2 in value) { 
     console.log(value[item2]); 
    } 
} 
+0

我理解它是如何看起來令人困惑的,但屬性是一個子帳戶數組,它又是具有自己屬性(包括另一個配對值數組)的數組。在這個例子中,只有一個子賬戶和一個配對組,但賬戶對象可以是:'{「_name」:「John」,「_ password」:「1234」,「_ attributes」:[[「Jane」, 「子」,[[10,1],[15,3]]],[ 「戴夫」, 「子」,[[1,7],[2,5]]]]}'。推送操作接收子賬戶。我相信你的第一段指出我做錯了什麼,即以不正確的方式引用數組。感謝您的反饋。 – ragr

+0

夠公平了,我要去除其他東西。 – Louis

+0

我試着像你指出的那樣訪問attr,只設法得到完整的字符串'Jane,sub,10,1'。嘗試打印項目給我0. attr [item]給我完整的字符串,和attr [item [0]]相同。更緊密,但由於某種原因,我無法得到簡。 – ragr

相關問題