У меня проблемы с использованием роутера от Express. Я хочу настроить свои маршруты с помощью нескольких файлов. Я получаю папку маршрутов с двумя файлами: routes.js и начертание.js
Я делаю следующее
var inscription = require('./routes/inscription.js');
var routes = require('./routes/routes.js');
потом
app.use('/', routes);
app.use('/inscription', inscription);
Но работают только маршруты из routes.js ...
Это содержимое routes.js
var router = require('express').Router();
var bodyParser = require('body-parser');
var urlencodedParser = bodyParser.urlencoded({ extended: false});
//Homepage
router.get('/', function(req, res){
res.setHeader('Content-Type', 'text/html');
res.status(200);
res.render('home.ejs');
});
//Connexion
router.post('/connexion', urlencodedParser, function(req, res){
//Some content
});
module.exports = router;
И это содержимое файла writing.js.
var router = require('express').Router();
var hash = require('password-hash');
var db = require('../models/users.js');
var bodyParser = require('body-parser');
var urlencodedParser = bodyParser.urlencoded({ extended: false});
router.get('/inscription', function(req, res){
res.setHeader('Content-Type', 'text/html');
res.status(200);
res.render('inscription.ejs');
});
router.post('/adduser', urlencodedParser, function(req, res){
var passwordHashed = hash.generate(req.body.inputPassword);
var newUser = {
nom : req.body.inputName,
email : req.body.inputEmail,
password : passwordHashed
};
db.addUser(newUser);
res.redirect('/');
});
router.post('/checkname', urlencodedParser, function(req, res){
var user = {
nom : req.body.inputName
};
db.checkName(user, function(length){
res.send(length);
});
});
router.post('/checkemail', urlencodedParser, function(req, res){
var user = {
email : req.body.inputEmail
};
db.checkEmail(user, function(length){
res.send(length);
});
});
module.exports = router;
Содержимое надписи.js работает, когда оно вставлено в файл routes.js ... Думаю, именно так я импортирую файл, который не работает.
Любая идея?





Этот маршрут router.get('/inscription', ...) в вашем маршрутизаторе с надписью настроен для маршрута /inscription/inscription, что, вероятно, не то, что вы планировали. Это потому, что вы указали его в двух местах:
app.use('/inscription', inscription);
router.get('/inscription', ...)
Итак, весь роутер стоит на /inscription от app.use('/inscription', inscription). Это означает, что любой маршрут, определяемый самим маршрутизатором, будет добавлен к этому пути.
Из вашего вопроса не совсем ясно, какими именно должны быть URL-адреса. Но если вы просто хотите, чтобы указанный выше router.get() работал с URL-адресом /inscription, измените:
router.get('/inscription', ...)
к:
router.get('/', ...)
Когда вы используете app.use('/inscription', inscription);, каждый маршрут в этом маршрутизаторе будет иметь префикс /inscription. Итак, этот маршрут:
router.post('/adduser', ...)
будет установлен по адресу:
/inscription/adduser
Или, если вы хотите, чтобы все маршруты записи тоже находились на верхнем уровне, измените:
app.use('/inscription', inscription);
к этому:
app.use('/', inscription);
Чтобы к пути ничего не добавлялось, кроме того, что определяет сам маршрутизатор.
@Jeremy - Обычно лучше всего экспортировать маршрутизатор из routes.js, а затем просто выполнить app.use(require('./routes.js')) в app.js. routes.js не знает правильный объект app, поэтому единственный способ сделать что-то сам - это передать ему объект app, экспортировав функцию, а затем вызвав эту функцию из app.js и передав объект app. Это обычно не то, что люди делают, потому что вышеприведенное предложение проще.
Хорошо! Большое спасибо за ваши полезные комментарии!
О, я вижу! Я не знал, что это так работает! Спасибо за очень четкое объяснение! Можно избежать включения маршрута в файл app.js ... Я имею в виду напрямую использовать app.use () в routes.js и делать только требование в верхней части файла app.js?