Ответ 1
var fs = require('fs');
fs.exists(file, function(exists) {
if (exists) {
// serve file
} else {
// mongodb
}
});
Я создаю суперпростой сервер в 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 для данных...
Спасибо!
var fs = require('fs');
fs.exists(file, function(exists) {
if (exists) {
// serve file
} else {
// mongodb
}
});
Я не думаю, что вы должны беспокоиться об этом, но скорее, как вы можете улучшить механизм кеширования. 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
этот фрагмент может помочь вам
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
}
} );