【发布时间】:2020-02-26 14:57:18
【问题描述】:
我正在使用Express、EJS 和 MongoDB 开发 blogging application(单击链接查看 GitHub 存储库)。
由于我无法识别的原因,当我(在浏览器中)尝试访问:http://localhost:3000/dashboard 它(浏览器)陷入加载状态并且从未实际加载仪表板路线时。
在我的“入口”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}!`));
在 dashboard route (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
});
}
});
}
};
重要提示: 每个单个帖子都必须显示在root url下,例如:
http://localhost:3000/5e3063dbfa749d9229bab26f其中5e3063dbfa749d9229bab26f当然是帖子ID。
这是出于 SEO 目的。我打算稍后用帖子 slug 替换 id:http://localhost:3000/my-great-post.
我怎样才能做到这一点?
【问题讨论】:
-
在循环覆盖中,
.use()= 所有 http 动词,.get()强制仅使用 GET 动词...只需将app.get('/dashboard', ...)更改为app.use('/dashboard', ...),因为在您的循环中您正在指定 @ 987654339@ already ...app.get('/dashboard', ...)仅在您传递的函数仅返回(res, req) => { ... }但您正在重新调整Router类型时才有效 -
@balexandre 我收到
router is not defined错误。 -
本周我创建了this code 以获取答案,看看我是如何做到的,并且会起作用:) - 你甚至可以学到一两件事!告诉我们进展如何