2014-10-09 7 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

+0

@Andbdrew хорошо пункт. Спасибо за совет. –

+2

И причина, по которой API по умолчанию использует буфер вместо строки, заключается в том, что буферы являются единственным безопасным способом чтения двоичных данных. Но вы можете преобразовать буфер в строку, даже после прочтения его, либо вызывая '.toString()' непосредственно из добавления, заставляя его в контексте строки: '' '+ buffer' – slebetman

ответ

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); 
}); 
Смежные вопросы