Самый быстрый способ проверить наличие файла в NodeJs - PullRequest
34 голосов
/ 09 января 2012

Я создаю супер простой сервер в узле, и в моем слушателе onRequest я пытаюсь определить, должен ли я обслуживать статический файл (с диска) или какой-то json (возможно, извлеченный из mongo) на основе пути вrequest.url.

В настоящее время я пытаюсь сначала выполнить статистику файла (потому что я использую mtime в другом месте), и если это не помогает, тогда я читаю содержимое с диска.Примерно так:

fs.stat(request.url.pathname, function(err, stat) {
    if (!err) {
        fs.readFile(request.url.pathname, function( err, contents) {
            //serve file
        });
    }else {
        //either pull data from mongo or serve 404 error
    }
});

Кроме кэширования результата fs.stat для request.url.pathname, есть ли что-то, что могло бы ускорить эту проверку?Например, будет ли так же быстро увидеть, нет ли ошибок fs.readFile вместо stat?Или использовать fs.createReadStream вместо fs.readFile?Или я мог бы проверить файл, используя что-то в child_process.spawn?По сути, я просто хочу убедиться, что не буду тратить лишнее время на беспорядок с fileio, когда запрос должен быть отправлен в mongo для данных ...

Спасибо!

Ответы [ 3 ]

58 голосов
/ 09 января 2012
var fs = require('fs');

fs.exists(file, function(exists) {
  if (exists) {
    // serve file
  } else {
    // mongodb
  }
});
2 голосов
/ 21 июля 2015

этот фрагмент может помочь вам

fs = require('fs') ;
var path = 'sth' ;
fs.stat(path, function(err, stat) {
    if (err) {
        if ('ENOENT' == err.code) {
            //file did'nt exist so for example send 404 to client
        } else {
            //it is a server error so for example send 500 to client
        }
    } else {
        //every thing was ok so for example you can read it and send it to client
    }
} );
2 голосов
/ 09 января 2012

Не думаю, что вам следует беспокоиться об этом, а о том, как вы можете улучшить механизм кэширования. fs.stat действительно подходит для проверки файлов, выполнение этого в другом дочернем процессе скорее замедлит вас, чем поможет здесь.

Connect реализовал промежуточное ПО staticCache () несколько месяцев назад, как описано в этом сообщении в блоге: http://tjholowaychuk.com/post/9682643240/connect-1-7-0-fast-static-file-memory-cache-and-more

Алгоритм кэширования с наименьшим недавним использованием (LRU) реализуется через Cache объект, просто вращающий объекты кэша при их попадании. это означает, что все более популярные объекты сохраняют свои позиции, в то время как другие выбрасывают из стека и собирают мусор.

Другие ресурсы:
http://senchalabs.github.com/connect/middleware-staticCache.html
Исходный код для staticCache

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...