2014-10-09 79 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); 
}); 
相关问题