Защо имаме нужда от буфери в node.js?

За да покажа съдържанието на файла в браузъра с помощта на node, първо опитах това:

var express = require('express')
  , fs  = require('fs')
  , app = express()
  , port = process.env.PORT || 5000;

app.use(express.logger());

var data = fs.readFileSync('index.html');


app.get('/', function(req, res){
  res.send(data);
});

app.listen(port, function(){
  console.log('Listenting on ' + port);
});

Това обаче не проработи според очакванията. Браузърът всъщност предлага съдържанието на index.html като файл, който първо трябва да изтегля и след това да го отворя ръчно в текстов редактор. след това се опитах да използвам буфер, за да направя същото нещо:

var express = require('express')
  , fs  = require('fs')
  , app = express()
  , port = process.env.PORT || 5000;

app.use(express.logger());

var data = new Buffer(fs.readFileSync('index.html'));


app.get('/', function(req, res){
  res.send(data.toString('utf-8'));
});

app.listen(port, function(){
  console.log('Listenting on ' + port);
});

Това работи според очакванията и съдържанието на index.html се показва в прозореца на браузъра. Въпреки това, в моето ограничено потребителско мнение относно Node.js. Буферният клас е глобален тип за работа с двоични данни. Файлът index.html обаче не съдържа никакви двоични данни. така че въпросите ми са:

  1. В кода по-горе, защо съдържанието на index.html беше предложено като изтегляне на файл (без буфер) вместо да се показва директно в браузъра (с буфер)?
  2. Защо трябва да използвам буфер, когато файлът съдържа само низови данни, без двоични?
  3. Какви са предлаганите места, където се използват буфери?
  4. Ако искам да науча повече за буферите и използвайте в Node. къде да отида?

person CuriousMind    schedule 14.07.2013    source източник
comment
Реклама 1) Трябва да зададете Content-Type заглавка, за да може файлът да се показва правилно от браузъра.   -  person Hubert OG    schedule 14.07.2013


Отговори (1)


Правилният начин за връщане на файл би бил да се използва асинхронен метод вместо метод за синхронизиране.:

 app.get('/', function(req, res){
   res.writeHead(200, {
    'Content-Type': 'text/plain' // set to whatever mime type you need. 
  });
  fileSystem.createReadStream(filePath).pipe(res);
});

Ако ще обслужвате статични файлове с express, тогава трябва да използвате статичен междинен софтуер.

За да разберете разликите във вашия пример, погледнете вида на съдържанието, който се връща. Това ще определи какво прави браузърът с вашия отговор.

В първия случай Express.js щеше да види буфер и да реши да върне данните като тип съдържание "приложение/октет-поток". Вашият браузър няма да знае какво да прави с това и да го върне като файл за изтегляне.

Във втория случай Express.js щеше да види String и да реши да върне данните като тип съдържание "text/plain". Вашият браузър знае как да се справи с това и ще ви го покаже.

Не мисля, че въпросът ви има много общо с буферите в node.js, а повече с това как Express.js res.send обработва различни типове вход.

Ако сте нов в Node, тогава не е нужно да знаете за буферите веднага според мен. В противен случай погледнете документите: http://nodejs.org/api/buffer.html#buffer_buffer

person AndyD    schedule 14.07.2013
comment
Така че файловата система връща буфери по подразбиране, отколкото низ, въпреки че съдържанието на файла може да е чисти низове и имаме нужда от заглавка тип съдържание на HTTP, за да отменим това. Интересно! Благодаря за отговора. - person CuriousMind; 14.07.2013
comment
Не. Всички файлове винаги са двоични. Ние просто интерпретираме тези байтове по различен начин в зависимост от типа на файла. Буферен обект може да върне байтовете, които държи по различни начини, като utf8 string или base64 - person AndyD; 14.07.2013
comment
The correct way to return a file would be to use an async method instead of a sync method.: - добре, обслужването на страницата от паметта е може би много по-бързо от асинхронно четене на диск. Въпреки това, този отговор показва поток за четене, а не асинхронен метод сам по себе си. - person Thomas Foster; 02.04.2015