2014-10-09 32 views
4

我已經提到this question。也就是說,我不相信我的問題在於對異步的誤解。爲什麼fs.readFile返回一個緩衝區?

這是我的模塊的相關部分。

var fs = require('fs'); 
var q = require('q'); 
var u = require('../utils/json'); 

var indexFile = './data/index.json'; 

function getIndex() { 
    var def = q.defer(), 
     promise = def.promise, 
     obj; 

    fs.readFile(indexFile, function(err,data) { 
     if (err) { 
      throw err; 
      def.reject(err); 
     } 
     console.log('data', data); 

     def.resolve(obj); 
    }); 

    return promise; 
} 

當我登錄'數據'時,我得到一個緩衝區(下),而不是該文件的JSON內容。

<Buffer 5b 7b 22 68 65 6c 6c 6f 22 3a 22 77 6f 72 6c 64 22 7d 5d> 

對此有何想法?

+2

另一方面,如果你想拒絕你的推遲,不要拋出'err'。 – Andbdrew 2014-10-09 02:19:32

+0

@Andbdrew好點。謝謝你的提示。 – 2014-10-09 02:23:09

+2

而API默認爲緩衝區而不是字符串的原因是緩衝區是讀取二進制數據的唯一安全方式。但是,即使在通過直接調用'.toString()'來讀取它後追加強制到字符串上下文中,也可以將緩衝區轉換爲字符串:'''+ buffer' – slebetman 2014-10-09 03:44:54

回答

8

根據Node.js API docs for 'fs' module,如果encoding選項沒有通過,read函數將返回一個緩衝區。

如果傳遞的編碼值,它會返回一個字符串與編碼:

fs.readFile('/etc/passwd', 'utf-8', callback)

1

嘗試......你需要包括編碼

fs.readFile(indexFile,'utf8', function(err,data) { 
    if (err) { 
     throw err; 
    } 
    //Do something with data 
    console.log(data); 
}); 
1

如前所述,fs模塊需要編碼選項作爲第二個參數。另外,如果你確定你的文件包含utf-8字符串,你可以使用;

fs.readFile(indexFile, function(err,data) { 
    if (err) { 
     return def.reject(err); 
    } 

    console.log('data', data.toString()); 

    def.resolve(obj); 
}); 
相關問題