异步和同步读取的结果不同

时间:2011-11-12 13:51:33

标签: node.js readfile fs

我有一个相当简单的脚本,它试图读取然后解析JSON文件。 JSON非常简单,我很确定它是有效的。

{
    "foo": "bar"
}

现在,我一直试图用fs.readFile阅读它。读取时不会发生错误,返回的数据是字符串。唯一的问题是字符串是空的。

我重复了我的代码但使用了fs.readFileSync,这使用相同的路径完美地返回了文件。两者都指定了utf-8编码。

这是非常简单的代码,你可以看到。

fs.readFile('./some/path/file.json', 'utf8', function(err, data) {
    if(!err) {
        console.log(data); // Empty string...
    }
});

console.log(fs.readFileSync('./some/path/file.json', 'utf8')); // Displays JSON file

可能是权限还是所有权?我尝试过755777的权限集无济于事。

我正在运行节点v0.4.10。任何建议指出我正确的方向将非常感激。感谢。

编辑:这是我实际代码的一个块。希望这会给你一个更好的主意。

// Make sure the file is okay
fs.stat(file, function(err, stats) {
    if(!err && stats.isFile()) {
        // It is okay. Now load the file
        fs.readFile(file, 'utf-8', function(readErr, data) {
            if(!readErr && data) {
                // File loaded!
                // Now attempt to parse the config
                try {
                    parsedConfig = JSON.parse(data);
                    self.mergeConfig(parsedConfig);

                    // The config was loaded and merged
                    // We can now call the callback
                    // Pass the error as null
                    callback.call(self, null);

                    // Share the news about the new config
                    self.emit('configLoaded', file, parsedConfig, data);
                }
                catch(e) {
                    callback.call(self, new Error(file + ': The config file is not valid JSON.'));
                }
            }
            else {
                callback.call(self, new Error(file + ': The config file could not be read.'));
            }
        });
    }
    else {
        callback.call(self, new Error(file + ': The config file does not exist.'));
    }
});

1 个答案:

答案 0 :(得分:1)

这很奇怪。

代码看起来。

var fs = require('fs');

fs.readFile('./jsonfile', 'utf8', function(err, data) {
        if(err) {
                console.error(err);
        } else {
                console.log(data);
                parsedConfig = JSON.parse(data);
                console.log(parsedConfig);
                console.log(parsedConfig.foo);
        }
});

Json文件:

{
        "foo": "bar"
}

输出:

$ node test_node3.js 
{
        "foo": "bar"
}

{ foo: 'bar' }
bar

这是在节点0.4.10上,但我很确定它应该适用于所有节点版本。

那么为什么你的数据是空的?在这种情况下你应该检查错误(如我的)并发布输出(如果有的话)。如果您没有错误,可以在github上填写bug