2013-09-14 3 views
1

Я довольно новичок в Node.js, и мне трудно понять, как можно загружать библиотеки или файлы, в runtime. По-видимому, это плохая идея загружать файлы во время выполнения, используя собственную функцию «require» Node.js, поскольку она блокирует ввод-вывод и поэтому не должна использоваться из обработчиков запросов. Таким образом, я предполагаю, что-то вроде этого следует избегать:Node.js - Загрузка файлов в Runtime

var http = require('http').createServer(function(req, res) { 
    var file = require('./pages/'+req.url); 
    res.end(); 
}).listen(8080); 

Итак, есть ли способ, чтобы потребовать файлы времени выполнения, в неблокирующем/асинхронном способе?

Я не думаю, что всегда можно было бы загружать файлы в «время загрузки», а не во время выполнения, потому что, как в приведенном выше примере, единственный способ узнать, какой файл загрузить/потребовать - это получить имя через req.url Недвижимость.

Так что это единственный вариант. Если все файлы в папке предварительно загружены, а затем вызваны по имени, в обратном вызове (используя fs.readdirSync или что-то, чтобы перебирать все файлы в папке и сравнивать имена полученных файлов с свойством req.url), но это похоже расточительный. «Предварительная загрузка» всех файлов в папке (возможно, около 50 файлов), а затем только с использованием одного из них, не кажется хорошей идеей. Я ошибаюсь?

В любом случае, я хотел бы просто узнать, есть ли способ потребовать от файлов в режиме исполнения лучше, неблокировать/асинхронно.

Спасибо!

ответ

4

Функция require() обычно используется для кэширования модулей или файлов конфигурации до запуска большинства приложений. Вы можете думать об использовании require() примерно так:

var file = fs.readFileSync('/path'); 

// depending on the file type 
eval(file); 
JSON.parse(file); 

Причина это делается таким образом, так что загружены зависимости в порядке. Если вы хотите, чтобы прочитать файл после инициализации приложения, вы должны использовать асинхронное чтение и реагировать на обратный вызов, как это:

var http = require('http'); 
http.createServer(function(req, res) { 
    fs.readFile('./pages/' + req.url, function(err, data) { 
    res.end(data); 
    }); 
}).listen(8080); 

Если вам нужно проверить, если существует файл, то вы можете использовать fs.stat() для проверьте наличие файла, а не запрос каталога.

var http = require('http'); 
http.createServer(function(req, res) { 
    var file = './pages/' + req.url; 
    fs.stat(file, (err, stats) { 
    if (err || !stats.isFile()) { 
     res.writeHead(404); 
     res.send(); 

     return; 
    } 

    fs.readFile(file, function(err, data) { 
     res.writeHead(200); 
     res.end(data); 
    }); 
    }); 
}).listen(8080); 
+0

Спасибо! Это отлично подходит для таких файлов, как статические файлы HTML, файлы CSS и т. Д. Но что, если это файл Javascript? Как мне оценить код Javascript, который я получаю из файла? ** eval ** на самом деле не очень хорошая идея, так как я должен это делать? – user2779891

+0

Но разве это не считается плохой практикой? Я имею в виду, что 'require()' блокирует? – user2779891

+0

Я удалил свой предыдущий комментарий, потому что он вводит в заблуждение. Я имел в виду, что если вам нужно что-то выполнить, тогда вы должны «require()» в начале приложения. Вот как 'require()' есть и должен использоваться. Вы не должны загружать функции в свое приложение после его запуска. – hexacyanide

Смежные вопросы