Поэтому в первую очередь я думаю, вы должны понять, что пошло не так.
Операция http-запроса является асинхронной. Это означает, что код обратного вызова в http.get() будет запущен в будущем, но fs.readFileSync из-за его синхронного характера будет выполняться и завершаться даже до того, как HTTP-запрос будет фактически отправлен в фоновый поток, который будет выполняться он, так как они оба вызываются в том, что обычно называют типом. Также fs.readFileSync возвращает значение и не использует обратный вызов.
Даже если вы замените fs.readFileSync на fs.readFile, код будет работать некорректно, поскольку операция readFile может выполняться до того, как ответ HTTP полностью будет считываться из сокета и записываться на диск.
я настоятельно рекомендую прочитать: stackoverflow question и/или Understanding the node.js event loop
Правильное место для вызова файла прочитанных когда поток ответа имеет закончил запись в файл, который будет выглядеть примерно так:
var request = http.get(url, function(response) {
response.pipe(file);
file.once('finish', function() {
fs.readFile(localFile, /* fill encoding here */, function(err, data) {
// do something with the data if there is no error
});
});
});
Конечно, это очень сырой и не рекомендуется писать асинхронный код, но это совсем другое обсуждение.
Сказав это, если вы загрузите файл, напишите его на диск и затем снова прочитайте все его содержимое в памяти для манипуляции, вы также можете отказаться от части файла и сразу же прочитать ответ в строке ,Ваш код будет выглядеть примерно так (это может быть реализовано несколькими способами):
var request = http.get(url, function(response) {
var data = '';
function read() {
var chunk;
while (chunk = response.read()) {
data += chunk;
}
}
response.on('readable', read);
response.on('end', function() {
console.log('[%s]', data);
});
});
Что вы действительно должны сделать ММО, чтобы создать поток, который будет стирают все данные, необходимые от ответа преобразования, в то время как не потребляют слишком много памяти и плодоношения это более элегантно глядя код:
var request = http.get(url, function(response) {
response.pipe(yourTransformStream).pipe(file)
});
Реализация этого преобразования потока, однако, может оказаться немного более сложным. Поэтому, если вы новичок на уровне узлов, и вы не планируете загружать большие файлы или много мелких файлов, чем, может быть, загружать все это в память, а выполнение строковых манипуляций на нем может быть проще.
Для получения дополнительной информации о преобразовании потоков:
Наконец, увидеть, если вы можете использовать любой из миллиона узлов .js, которые уже там :-) взгляните на these search results на np m
Не хватает времени, чтобы предоставить официальный и проверенный ответ, но вы правы. послушайте file.on ('finished', function() {}), см. http://nodejs.org/api/stream.html#stream_event_finish –