Использование маршрутов в Express-js
Итак, я начинаю использовать Node.js. Я видел видео с Райаном Далем на http://nodejs.org/ и слышал, что он рекомендовал Express-js для веб-сайтов.
Я скачал последнюю версию Express и начал кодировать. У меня есть полноценный статический вид на /, но как только я пытаюсь отправить параметры, я получаю такие ошибки:
Cannot GET /wiki
Я попытался следовать руководству на http://expressjs.com/, но способ использования маршрутов изменился в последней версии, что делает руководство непригодным для использования.
Руководство:
app.get('/users/:id?', function(req, res, next){
var id = req.params.id;
if (id) {
// do something
} else {
next();
}
});
Создано Экспресс:
app.get('/', routes.index);
Моя проблема возникает, когда я пытаюсь добавить другой маршрут.
app.get('/wiki', routes.wiki_show);
Я перепробовал несколько подходов, но продолжаю получать Cannot GET /wiki
(404) ошибка.
маршруты /index.js выглядит так:
exports.index = function(req, res) {
res.render('index', { title: 'Test', articles: articles, current_article: current_article, sections: sections })
};
Единственное, что я сделал там, это добавил некоторые параметры (массивы в одном и том же файле), и это я работаю. Но когда я копирую содержимое и меняю exports.index
в exports.wiki
или же exports.wiki_show
Я все еще получаю Cannot GET /wiki
ошибка.
Может кто-нибудь объяснить мне, что я здесь скучаю? - Спасибо.
4 ответа
Итак, после того, как я создал свой вопрос, я получил соответствующий список справа с похожей проблемой: организовать маршруты в Node.js.
Ответ в этом посте связан с экспресс-репозиторием на GitHub и предлагает взглянуть на пример " разделения маршрута".
Это помогло мне изменить мой код, и теперь он у меня работает. - Спасибо за ваши комментарии.
Моя реализация в итоге выглядела так;
Мне требуются мои маршруты в app.js:
var express = require('express')
, site = require('./site')
, wiki = require('./wiki');
И я добавляю свои маршруты так:
app.get('/', site.index);
app.get('/wiki/:id', wiki.show);
app.get('/wiki/:id/edit', wiki.edit);
У меня есть два файла с именами wiki.js и site.js в корне моего приложения, которые содержат это:
exports.edit = function(req, res) {
var wiki_entry = req.params.id;
res.render('wiki/edit', {
title: 'Editing Wiki',
wiki: wiki_entry
})
}
Пример экспресс -карты маршрутов сопоставляет пути URL с объектами, что, в свою очередь, сопоставляет глаголы http с функциями. Это закладывает маршрут в дереве, которое является кратким и легко читаемым. Объекты приложений также записываются как объекты, а функции - как вложенные методы.
var express = require('../../lib/express')
, verbose = process.env.NODE_ENV != 'test'
, app = module.exports = express();
app.map = function(a, route){
route = route || '';
for (var key in a) {
switch (typeof a[key]) {
// { '/path': { ... }}
case 'object':
app.map(a[key], route + key);
break;
// get: function(){ ... }
case 'function':
if (verbose) console.log('%s %s', key, route);
app[key](route, a[key]);
break;
}
}
};
var users = {
list: function(req, res){
res.send('user list');
},
get: function(req, res){
res.send('user ' + req.params.uid);
},
del: function(req, res){
res.send('delete users');
}
};
var pets = {
list: function(req, res){
res.send('user ' + req.params.uid + '\'s pets');
},
del: function(req, res){
res.send('delete ' + req.params.uid + '\'s pet ' + req.params.pid);
}
};
app.map({
'/users': {
get: users.list,
del: users.del,
'/:uid': {
get: users.get,
'/pets': {
get: pets.list,
'/:pid': {
del: pets.del
}
}
}
}
});
app.listen(3000);
Похоже, что только index.js загружается, когда вам нужно ("./ways") . Я использовал следующий код в index.js для загрузки остальных маршрутов:
var fs = require('fs')
, path = require('path');
fs.readdirSync(__dirname).forEach(function(file){
var route_fname = __dirname + '/' + file;
var route_name = path.basename(route_fname, '.js');
if(route_name !== 'index' && route_name[0] !== "."){
exports[route_name] = require(route_fname)[route_name];
}
});
Вы также можете организовать их в модули. Так было бы что-то вроде.
./
controllers
index.js
indexController.js
app.js
а затем в indexController.js контроллеров экспортируйте ваши контроллеры.
//indexController.js
module.exports = function(){
//do some set up
var self = {
indexAction : function (req,res){
//do your thing
}
return self;
};
тогда в index.js контроллеров dir
exports.indexController = require("./indexController");
и наконец в app.js
var controllers = require("./controllers");
app.get("/",controllers.indexController().indexAction);
Я думаю, что этот подход обеспечивает более четкое разделение, а также вы можете настроить свои контроллеры, передав, возможно, соединение db.
Никто никогда не должен писать app.use('/someRoute', require('someFile')) до тех пор, пока он не сформирует кучу кода.
Просто не имеет смысла тратить время на вызов / определение маршрутов. Даже если вам действительно нужен настраиваемый контроль, это, вероятно, только на некоторое время, и в большинстве случаев вы хотите иметь возможность просто создать стандартную файловую структуру маршрутов, а модуль сделает это автоматически.
Попробуйте Route Magic
По мере масштабирования приложения вызовы маршрутизации начнут формировать гигантскую кучу бесполезного кода. Вам нужно сделать всего 2 строки кода для обработки всехapp.use
маршрутизация вызовов с помощью Route Magic следующим образом:
const magic = require('express-routemagic')
magic.use(app, __dirname, '[your route directory]')
Для тех, кто хочет обрабатывать вручную, просто не используйте передачу каталога в Magic.