【问题标题】:Why is fs.readFile returning a buffer?为什么 fs.readFile 返回一个缓冲区?
【发布时间】:2014-12-03 20:09:44
【问题描述】:

我已经提到了this question。也就是说,我不认为我的问题在于对异步的误解。

这是我模块的相关部分。

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>

有什么想法吗?

【问题讨论】:

  • 顺便说一句,如果你想拒绝你的 deferred,请不要抛出 err
  • @Andbdrew 好点。感谢您的提示。
  • API 默认使用缓冲区而不是字符串的原因是缓冲区是读取二进制数据的唯一安全方式。但是,即使在读取缓冲区之后,您也可以将缓冲区转换为字符串,方法是直接调用 .toString() 或将其附加到字符串上下文中:'' + buffer

标签: javascript node.js asynchronous q


【解决方案1】:

根据Node.js API docs for 'fs' module,如果encoding 选项未通过,read 函数将返回一个缓冲区。

如果你传递一个编码值,它将返回一个具有该编码的字符串:

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

【讨论】:

    【解决方案2】:

    试试这个...你需要包含编码

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

    【讨论】:

      【解决方案3】:

      如前所述,fs 模块需要编码选项作为第二个参数。

      另外,如果你确定你的文件包含 utf-8 字符串,你可以使用;

      fs.readFile(indexFile, function(err,data) {
          if (err) {
              return def.reject(err);
          }
      
          console.log('data', data.toString());
      
          def.resolve(obj);
      });
      

      【讨论】:

        猜你喜欢
        • 2022-11-28
        • 2017-04-01
        • 2011-09-21
        • 2021-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多