2011-11-30 84 views
4

我在Ubuntu 11.10上使用Redis 2.2.11和Node,並且我保存了一個字符串,但它被作爲緩衝區返回。Redis在某些操作系統上將字符串保存爲緩衝區,而不是其他操作系統?

id = 1234; 
    console.log('data', data); 
    client.hmset("user:" + id, "name", data['name']); 
    client.hmget('user:' + id, "name", function(err, d) { 
     console.log('data retrieved', d); 
    }); 

這將產生在控制檯上執行以下操作:

data { name: 'RealServer' } 
data retrieved [ <Buffer 41 6e 6e 61 52 65 61 6c 53 65 72 76 65 72> ] 

爲什麼要在一個字符串,出來作爲緩衝? 緩衝區使調試非常困難!

在我的本地設置(使用Redis 2.2.14的MacOS 10.6)上,檢索到的數據打印爲字符串,很好。我想找到一個可以繼續在兩個系統上工作的解決方案。

更新:它也工作正常,沒有在CentOS 5.7指定的編碼。這是特定於Ubuntu的東西嗎?是否有全系統修復?

回答

0

參見:http://nodejs.org/docs/v0.3.1/api/buffers.html

純JavaScript是Unicode友好的,但不是很好的二進制數據。當處理TCP流或文件系統的 時,需要處理 八位字節流。節點有幾個策略來操作,創建,消耗八位組流。

原始數據存儲在Buffer類的實例中。 A緩衝區類似於整數數組,但對應於V8堆外部的原始內存區域分配 。緩衝區不能調整大小。

Buffer對象是全局的。

緩衝器和JavaScript字符串對象之間的轉換需要一個 明確的編碼方法。

因爲你沒有指定編碼,它顯示爲默認的原始數據。你可以使用buffer.toString來產生一個標準的JS字符串。

0

由於您尚未指定編碼,因此在打印時不知道使用哪種編碼。使用帶編碼的toString函數作爲參數來正確記錄它。

client.hmget('user:' + id, "name", function(err, d) { 
    console.log('data retrieved', d.toString('utf8')); 
}); 
+0

謝謝!但是,爲什麼在我的MacOS系統上不會發生這種情況?是否有我可以使用的全局編碼選項? – flossfan

+1

如果沒有在CentOS 5.7上指定編碼,它也可以正常工作。這是OS範圍內的事情嗎?如果可以,我如何在Ubuntu中更改它? – flossfan

+0

我會說只是指定編碼更好,這樣它就能保證在所有平臺上都能正常工作。 – DHamrick