Как получить доступ к родительским модулям при многоуровневой маршрутизации в mongoDB - PullRequest
0 голосов
/ 12 июня 2019

В качестве личного проекта я пытаюсь создать социальный медиа-сайт для коллекционеров плюшевых мишек.Я бы хотел, чтобы пользователи могли создавать «коллекционные» страницы, которые они могут заполнять индивидуальными страницами профиля для каждого из своих медведей.Наконец, я хотел бы, чтобы другие пользователи могли комментировать как страницу коллекции, так и отдельные страницы профиля.

Однако я сталкиваюсь с ошибкой в ​​маршруте "/ new" для комментариев к индивидуальному пользователю.страницы профиля.Я не могу найти идентификатор родительской коллекции.

Ниже приведен код, с которым я работаю.Я начинаю с поиска идентификатора для коллекции, затем пытаюсь получить идентификатор для медведя (страница индивидуального профиля).Тем не менее, процесс продолжает ловиться на первом шаге.

var express = require("express");
var router = express.Router({mergeParams: true});
var Bear = require("../models/bear");
var Comment = require("../models/comment");
var Collection = require("../models/collection");
var middleware = require("../middleware");

//comments new
router.get("/new", middleware.isLoggedIn, function(req, res) {
    Collection.findById(req.params.id, function(err, foundCollection) {
        if(err || !foundCollection){
            req.flash("error", "Collection not found");
            return res.redirect("back");
        }
        Bear.findById(req.params.bear_id, function(err, foundBear) {
            if(err){
                res.redirect("back");
            } else {
                res.render("bcomments/new", {collection_id: req.params.id, bear: foundBear, collection: foundCollection});
            }
        });
    });
});

//bcomments create
router.post("/", middleware.isLoggedIn, function(req, res){
    Collection.findById(req.params.id, function(err, foundCollection) {
        if(err || !foundCollection){
            req.flash("error", "Collection not found");
            return res.redirect("back");
        }
        //look up bear using id
        Bear.findById(req.params.id, function(err, foundBear){
        if(err){
             console.log(err);
             res.redirect("/bears" + bear._id);
        } else {
            //create new comment
            Comment.create(req.body.comment, function(err, comment){
                if(err){
                    req.flash("error", "Something went wrong");
                    console.log(err);
                } else {
                    //add username and id to comment
                    comment.author.id = req.user._id;
                    comment.author.username = req.user.username;
                    //save comment
                    comment.save();
                    //connect new comment to bear
                    bear.comments.push(comment);
                    bear.save();
                    //redirect bear show page
                    req.flash("success", "Successfully added comment");
                    res.redirect("/collections/" + foundCollection._id + "/bears/" + foundBear._id);
                    }
                 });
             }
         });
     });    
 });

Таким образом, вместо рендеринга новой формы комментария, он выдает «нулевую» ошибку и перенаправляет обратно на первый оператор if.

Если кто-нибудь может помочь мне разобраться в этом, я был бы чрезвычайно благодарен.Спасибо.

1 Ответ

0 голосов
/ 12 июня 2019

Мне кажется, проблема в том, что вы определяете путь "/ new" (без параметров) и пытаетесь получить доступ к req.params.id.Если вы ожидаете иметь параметр id, вы должны определить его в пути следующим образом: router.get("/new/:id", ....Обратитесь к официальной документации Express для более подробной информации.

РЕДАКТИРОВАТЬ:

Возможно, вы смешали req.params с req.query и req.body.Если вы передаете параметры в запросе, вы должны получить к ним доступ через req.query (например: req.query.id или req.query.bear_id) в случае GET и DELETE или через req.body в POST и PUT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...