#javascript #express #model-view-controller #routes
#javascript #экспресс #модель-представление-контроллер #маршруты
Вопрос:
Я создаю ежедневник, и пока я настраивал маршруты, я заметил, что получаю 404 для всех маршрутов, отличных от маршрута главной домашней страницы, т.Е. Индекса или «/».
Это app.js файл
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var calendarRouter = require('./routes/calendar');
var app = express();
//Set up mongoose connection
var mongoose = require('mongoose');
var mongoDB = 'mongodb srv://<user-name>:<password>@cluster0.3xw67.gcp.mongodb.net/<db-name>?retryWrites=trueamp;w=majority';
mongoose.connect(mongoDB, { useNewUrlParser: true , useUnifiedTopology: true});
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'MongoDB connection error:'));
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/calendar', calendarRouter);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
Это calendar.js маршрут
var express = require('express');
var router = express.Router();
var schedule_controller = require('../controllers/scheduleController');
router.get('/', schedule_controller.index);
router.get('/calendar/create', schedule_controller.schedule_create_get);
router.post('/calendar/create', schedule_controller.schedule_create_post);
router.get('/calendar/:id/delete', schedule_controller.schedule_delete_get);
router.post('/calendar/:id/delete', schedule_controller.schedule_delete_post);
router.get('/calendar/:id/update', schedule_controller.schedule_update_get);
router.post('/calendar/:id/update', schedule_controller.schedule_update_post);
router.get('/calendar/event/:id', schedule_controller.schedule_details);
router.get('/events', schedule_controller.schedule_list);
module.exports = router;
Это index.js маршрут, я сделал редирект здесь!
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.redirect('/calendar');
});
module.exports = router;
И вот контроллер для calendar.js маршрут.
var Schedule = require('../models/schedule');
exports.index = function(req, res) {
res.send('NOT IMPLEMENTED: Site Home Page');
};
exports.schedule_list = function(req, res) {
res.send('NOT IMPLEMENTED: Schedule List');
};
exports.schedule_details = function(req, res) {
res.send('NOT IMPLEMENTED: Schedule Detail: ' req.params.id);
};
exports.schedule_create_get = function(req, res) {
res.send('NOT IMPLEMENTED: Schedule create GET');
};
exports.schedule_create_post = function(req, res) {
res.send('NOT IMPLEMENTED: Schedule create POST');
};
exports.schedule_delete_get = function(req, res) {
res.send('NOT IMPLEMENTED: Schedule delete GET');
};
exports.schedule_delete_post = function(req, res) {
res.send('NOT IMPLEMENTED: Schedule delete POST');
};
exports.schedule_update_get = function(req, res) {
res.send('NOT IMPLEMENTED: Schedule update GET');
};
exports.schedule_update_post = function(req, res) {
res.send('NOT IMPLEMENTED: Schedule update POST');
};
Комментарии:
1. ПРИМЕЧАНИЕ . Я использую учебник по MDN для веб-сайта локальной библиотеки в качестве ссылки / руководства по этому приложению.
2. Я только что узнал, что если я поменяю местами маршруты, это будет работать нормально. Маршрутизация индекса — единственный работающий маршрут. Я думаю, что это как-то связано с перенаправлением.
Ответ №1:
Хорошо, я нашел ошибку, это я использовал индексный URL, /
на который я перенаправил /calendar
. И я использовал остальные маршруты URL, не вызывая перенаправленный, т.Е. /calendar
.
Я попытался вызвать маршруты с /calendar/calendar
помощью, и это работает!
Я пока не знаю, как это объяснить. Я надеюсь, что коллеги из stackoverflow могли бы объяснить, почему это происходит.
Вот я пытаюсь объяснить новичку!
Перенаправление индексного маршрута /
на другой URL-маршрут изменяет основной URL-маршрут веб-сайта (адрес). Таким образом, все вспомогательные маршруты, которые являются всем, кроме индексного маршрута, должны явно вызывать перенаправленный маршрут (новый адрес). Потому что каждый раз, когда мы вызываем старый адрес, перенаправление изменяет его на новый. Превращение старого адреса в мертвый.
(Юмор : я хотел бы указать на пример, рассматривающий числа. Это похоже на целые числа и натуральные числа. Перенаправление — это когда целое число изменяется на натуральное число.)