Различные результаты асинхронного и синхронного чтения - PullRequest
0 голосов
/ 12 ноября 2011

У меня довольно простой скрипт, который пытается прочитать, а затем проанализировать файл 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

Может ли это быть разрешения или владение? Я пробовал набор разрешений 755 и 777 безрезультатно.

Я использую узел 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 Ответ

1 голос
/ 12 ноября 2011

Это довольно странно.

Код выглядит.

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, но я уверен, что он должен работать на всех версиях узла.

Так почему ваши данные пусты? Вы должны проверить err в этом случае (как мой) и опубликовать вывод, если таковые имеются. Если у вас нет ошибок, вы можете заполнить ошибку на github

...