Подтвердить что ты не робот

Самый быстрый способ проверить наличие файла в NodeJs

Я создаю суперпростой сервер в node и в моем 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? В основном я просто хочу убедиться, что я не трачу лишнее время на вождение w/fileio, когда запрос должен быть отправлен в mongo для данных...

Спасибо!

4b9b3361

Ответ 1

var fs = require('fs');

fs.exists(file, function(exists) {
  if (exists) {
    // serve file
  } else {
    // mongodb
  }
});

Ответ 2

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

Соединение реализовало промежуточное ПО 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

Ответ 3

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

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
    }
} );