Express. js ошибка приложения: браузер застрял в состоянии загрузки при попытке доступа к определенному маршруту - PullRequest
0 голосов
/ 04 февраля 2020

Я работаю над приложением для ведения блога (нажмите на ссылку, чтобы увидеть репозиторий GitHub ) с Express, E JS и MongoDB.

По какой-то причине я не смог определить, когда (в браузере) я пытаюсь go сделать следующее: http://localhost:3000/dashboard он (браузер) застревает в состоянии загрузки и никогда не загружает панель мониторинга. маршрут.

В индексе "entry". js файл, который у меня есть:

const express = require('express');
const dotenv = require('dotenv');
const mongoose = require('mongoose');
const path = require('path');
const morgan = require('morgan');
const expressLayouts = require('express-ejs-layouts');
const app = express();

dotenv.config();

//Conect to MONGODB
mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => {
    console.log('conected');
});

mongoose.connection.on('error', err => {
    console.log(`DB connection error: ${err.message}`);
});

// Set static directory
app.use(express.static(path.join(__dirname, 'public')));

// Set views directory
app.set('views', path.join(__dirname, 'views'));

// Set view engine
app.set('view engine', 'ejs');

// Use Express Layouts
app.use(expressLayouts);

// Middleware
app.use(morgan('dev'));

// Bring the Posts Routes
const postsRoute = require('./routes/front-end/posts');

// Get Posts
app.use('/', postsRoute);

// Get Single Post
app.use('/:id', postsRoute);

// Bring the Dashboard
const dashboardRoute = require('./routes/admin/dashboard');

// Get Dashboard
app.use('/dashboard', dashboardRoute);

const port = process.env.PORT || 3000;

app.listen(port, () => console.log(`Listening on port ${port}!`));

В маршруте панели инструментов (маршруты \ admin \ панель инструментов. js) У меня есть:

const express = require('express');
const dashboardController = require('../../controllers/admin/dashboard');

// Express router
const router = express.Router();

// Dysplay Dashboard
router.get('/dashboard', dashboardController.displayDashboard);

module.exports = router;

В то время как в контроллере приборной панели :

const Post = require('../../models/post');

exports.displayDashboard = (req, res, next) => {
    res.send('Dashboard');
};

в routes/front-end/posts.js У меня:

const express = require('express');
const postsController = require('../../controllers/front-end/posts');

// Express router
const router = express.Router();

// Get Posts
router.get('/', postsController.getPosts);

// Get Single Post
router.get('/:id', postsController.getSinglePost);

module.exports = router;

контроллер сообщений :

const Post = require('../../models/post');

exports.getPosts = (req, res, next) => {
    const posts = Post.find({}, (err, posts) => {
        if(err){
            console.log('Error: ', err);
        } else {
            res.render('default/index', {
                layout: 'default/layout',
                website_name: 'MEAN Blog',
                page_heading: 'XPress News',
                page_subheading: 'A MEAN Stack Blogging Application',
                posts: posts
            });
        }
    });
};

exports.getSinglePost = (req, res, next) => {
    let id = req.params.id;
    if (id.match(/^[0-9a-fA-F]{24}$/)) {
        Post.findById(id, function(err, post){
            if(err){
                console.log('Error: ', err);
            } else {
                res.render('default/singlepost', {
                    layout: 'default/layout',
                    website_name: 'MEAN Blog',
                    post: post
                });
            }
        });
    }
};

ВАЖНО: Необходимо, чтобы каждое отдельное сообщение отображалось под root url , например: http://localhost:3000/5e3063dbfa749d9229bab26f, где 5e3063dbfa749d9229bab26f - это, конечно, идентификатор сообщения.

Это для целей SEO. Я собираюсь позже заменить id на post slug : http://localhost:3000/my-great-post.

Как мне этого добиться?

Ответы [ 11 ]

0 голосов
/ 04 февраля 2020

в вашем файле ввода index.js, вы регистрируете маршруты неправильно.

Для регистрации маршрутов вы должны использовать app.use(), а не app.get()

Следовательно измените app.get('/', postsRoute); на app.use('/', postsRoute);

Дайте мне знать, если это сработало.

Правка: после повторного просмотра я увидел, что вы добавляете префикс "приборная панель" дважды к маршруту.

Поэтому измените строку: app.get('/dashboard', dashboardRoute);

на

app.use('/', dashboardRoute);

...