我正在使用blogging application,Express和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