快递.js博客应用程序错误:按类别过滤帖子抛出"Cast to ObjectId failed"失败的错误



我正在使用Express、EJS和MongoDB开发博客应用程序(单击链接查看GitHubrepo(。

我有帖子,它们被分组到类别中,每个类别都在自己的集合中。

我在尝试按类别筛选帖子时遇到了一个问题。为了获得按类别url发布的帖子,我将类别名称变成一个slug,并以这种方式使用:

Posted in <a href="/<%= post.category.cat_name.replace(/s+/g, '-').toLowerCase(); %>"><%= post.category.cat_name %></a>

在公共路线文件中,我有:

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);
// Get Posts by Category
router.get('/:catname', postsController.getPostsByCategory);
module.exports = router;

Post模型:

const mongoose = require('mongoose');
const postSchema = new mongoose.Schema({
title: {
type: String,
required: true
},
short_description: {
type: String,
required: true
},
full_text: {
type: String,
required: true
},
category: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Category'
},
post_image: {
type: String,
required: false
},
updated_at: {
type: Date,
default: Date.now()
},
created_at: {
type: Date,
default: Date.now()
}
});
module.exports = mongoose.model('Post', postSchema);

类别模型:

const mongoose = require('mongoose');
const categorySchema = new mongoose.Schema({
cat_name: {
type: String,
required: true
},
updated_at: {
type: Date,
default: Date.now()
},
created_at: {
type: Date,
default: Date.now()
}
});
module.exports = mongoose.model('Category', categorySchema);

在帖子控制器中,我将段塞返回到类别名称中,以按类别名称过滤帖子

exports.getPostsByCategory = (req, res, next) => {
function titleize(slug) {
var words = slug.split("-");
return words.map(function(word) {
//return word;
return word.charAt(0).toUpperCase() + word.substring(1).toLowerCase();
}).join(' ');
}
const postCategory = titleize(req.params.catname);
const posts = Post.find({ cat_name: postCategory }, (err, posts) => {
console.log('Category: ', postCategory);
if(err){
console.log('Error: ', err);
} else {
res.render('default/index', {
moment: moment,
layout: 'default/layout',
website_name: 'MEAN Blog',
page_heading: 'XPress News',
page_subheading: 'A MEAN Stack Blogging Application',
posts: posts.reverse(),
});
}
}).populate('category');
};

console.log('Category: ', postCategory)输出Category: Favicon.ico,而不是类别名称

我做错了什么?

如果我读对了,res应该是json对。

我猜您的post.reverse()不会以json格式输出。

首先-看看你问DB的那一刻-你需要等待答案,所以你应该在你的路线中使用Promise.than()async/await。。。请求中的另一个参数是STRING,但在mongo模式中,您有Object。。。

所以你应该接收类似CCD_ 6的smth,这取决于你的视觉:首先从category.db =>中选择类别,这样你就可以收到类别Object,然后你可以使用这个对象搜索帖子。。。,或者你可以先按类别填充帖子的结果(获得普通的类别字段(,然后进行进一步的搜索。。。

post-模式中的category$ref-模式的category-模式,这就是它持有objectId的原因。为了在使用.find()时引用并实际查询category-模式,您需要首先填充它:

Post.
find({}).
populate({
path: 'category',
match: { cat_name: postCategory}
}).
exec((err, posts) => {
// ...
});

$ref/populate()的猫鼬文档在这里有点隐藏,以防你想了解更多

感谢Lilian Baxan,这是controllersfront-endposts.js:中正确的getPostsByCategory方法

const Category = require('../../models/categories');
//more code here
exports.getPostsByCategory = async (req, res, next) => {
function titleize(slug) {
var words = slug.split("-");
return words.map(function(word) {
//return word;
return word.charAt(0).toUpperCase() + word.substring(1).toLowerCase();
}).join(' ');
}
const postCategory = titleize(req.params.catname);
const singleCategory = await Category.findOne({cat_name:postCategory})
const posts = await Post.find({ category : singleCategory }, (err, posts) => {
if (err) {
console.log('Error: ', err);
} else {
res.render('default/index', {
moment: moment,
layout: 'default/layout',
website_name: 'MEAN Blog',
page_heading: 'XPress News',
page_subheading: 'A MEAN Stack Blogging Application',
posts: posts.reverse(),
});
}
}).populate('category');
};

相关内容

最新更新