我正在使用blogging applicationExpress和MongoDB创建EJS(单击链接以查看GitHub存储库)。

由于某种原因,我无法识别,何时(在浏览器中)尝试访问:http://localhost:3000/dashboard它(在浏览器中)卡在加载状态,并且从未实际加载仪表板路线。

在“ entry” index.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}!`));


在仪表板路由(routes \ admin \ dashboard.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
                });
            }
        });
    }
};



  重要:
  必须将每个帖子都显示在根URL下,例如:http://localhost:3000/5e3063dbfa749d9229bab26f其中5e3063dbfa749d9229bab26f当然是帖子ID。


这是用于SEO的目的。我打算稍后将ID替换为后塞:http://localhost:3000/my-great-post

我该如何实现?

最佳答案

已修复问题,有关完整运行示例克隆node-cheat XPressBlog并先运行node index,然后运行npm i的问题。

将浏览器指向http://localhost:3000/dashboard,输出:


  这是仪表板


http://localhost:3000,输出:


  这将加载所有帖子;继续您的逻辑!


http://localhost:3000/my-great-post,输出:


  这将使用slug加载单个帖子:my-great-post


你做错了什么?

您对app.use(的使用感到困惑,因此这些都是根据您的需要(如您的帖子所述)固定的,如下所示:

const dashboardRoute = require("./routes/admin/dashboard");
app.use('/dashboard', dashboardRoute);

const postsRoute = require('./routes/front-end/posts');
app.use('/', postsRoute);


如果您想进一步了解app.use,请点击以下链接:


nodejs-express-what-is-app-use
using-middleware

09-05 14:07
查看更多