Node.js Ошибка типа: Не удается прочитать свойство «заголовок» неопределенного

#node.js #routes #lodash #typeerror

Вопрос:

2 недели программирования, и я создаю свое первое веб-приложение с использованием nodejs. Все работает нормально, за исключением одного маршрута, который приводит к сбою всего моего приложения и выдает вышеуказанную ошибку. Я пытался решить эту проблему, но большинство решений для ошибки предназначены для какой-то конкретной структуры.

Вот код узла для справки

 const express = require("express");
const ejs = require("ejs");
const mongoose = require("mongoose");
const _ = require("lodash");

const session = require("express-session");
const passport = require("passport");
const passportLocalMongoose = require("passport-local-mongoose");

const app = express()

app.use(express.static("public"));
app.set("view engine", "ejs");
app.use(express.urlencoded({extended:true}));

app.use(session({
    secret: 'loremipsum',
    resave: false,
    saveUninitialized: true,
}))

app.use(passport.initialize());
app.use(passport.session());

mongoose.connect("mongodb://localhost:27017/loremipsum", {useNewUrlParser: true, useUnifiedTopology: true})
mongoose.set("useCreateIndex", true);

const userSchema = new mongoose.Schema({
    email: String,
    password: String
})

const loremSchema = new mongoose.Schema({
    title: String,
    body: String,
})

userSchema.plugin(passportLocalMongoose);

const User = new mongoose.model("User", userSchema)
const lorem= new mongoose.model("lorem", loremSchema)

passport.use(User.createStrategy());

passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

// routes

app.route("/")
.get(function(req,res){
    lorem.find({}, function(err, found){
        res.render("home",{
            posts: found,
        })
    })
});

app.route("/compose")
.get(function(req,res){
    if(req.isAuthenticated()){
        res.render("compose",{
            title: "Be lorem"
        })
    }else{
        res.redirect("/login")
    }
})
.post(function(req,res){
    const lorem= new lorem({
        title:req.body.postTitle,
        body:req.body.postContent,
    })
    lorem.save()
    res.redirect("/")
});

app.route("/community")
.get(function(req,res){
    if(req.isAuthenticated()){
        res.render("community")
    }else{
        res.redirect("/login")
    }
});

app.route("/login")
.get(function(req,res){
    res.render("login")
})
.post(function(req,res){
    const user = new User({
        username: req.body.username,
        password: req.body.password
    })

    req.login(user, function(err){
        if(!err){
            passport.authenticate("local")(req,res, function(){
                res.redirect("/compose");
            })
        }
    })
});

app.route("/signup")
.get(function(req,res){
    res.render("signup")
})
.post(function(req,res){
    User.register({username: req.body.username}, req.body.password, function(err,user){
        if(err){
            console.log("Please, try again...");
            res.redirect("/signup")
        }else{
            passport.authenticate("local")(req,res, function(){
                res.redirect("/compose");
            })
        }
    })
});

app.route("/logout")
.get(function(req,res){
    req.logOut();
    res.redirect("/");
});

app.get("/:id" ,function(req,res){
    const route = req.params.id;

    lorem.findOne({_id: route}, function(err, foundPost){
            res.render("blog",{
                heading: foundPost.title,
                content: foundPost.body,
            })
    })
})

//listen

app.listen(3000, function(){
    console.log("Huston, this is node speaking!!!")
})
 

при добавлении следующего маршрута приложение завершает работу

 app.get("/:id" ,function(req,res){
    const route = req.params.id;

    lorem.findOne({_id: route}, function(err, foundPost){
            res.render("blog",{
                heading: foundPost.title,
                content: foundPost.body,
            })
    })
})
 

Ниже приведен фрагмент кода из home.ejs и маршрута blog.ejs.

главная.ejs

 <div class="experiment">
                <div class="col-md-8 card text-left">
                    <% posts.forEach(function(post){ %>
                        <div class="card-body">
                            <div class="contents row no-gutters bg-light position-relative">
                                <div class="col-md-8 position-static p-4 pl-md-0">
                                <h5 class="mt-0"><%=post.title%></h5>
                                <p>
                                  <%=post.body.substring(0,150)%>
                                  <a href="/<%=post._id%>">  ...Read more</a>
                                </p>
                                <!-- <a href="#" class="stretched-link">Go somewhere</a> -->
                                </div>
                                <div class="col-md-4 mb-md-0  mb-md-0 p-md-2 unsplash">
                                  <img src="https://images.unsplash.com/photo-1628768709954-b141dde9d650?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8amp;ixlib=rb-1.2.1amp;auto=formatamp;fit=cropamp;w=752amp;q=80" class="w-100" alt="...">
                              </div>
                          </div>
                          <div class="card-header">
                              <ul class="nav nav-tabs card-header-tabs">
                                <li class="nav-item">
                                  <a class="nav-link" href="#">Comment</a>
                                </li>
                                <li class="nav-item">
                                  <a class="nav-link" href="#">Share</a>
                                </li>
                              </ul>
                            </div>
                        </div>
                    <%})%>                  
            </div>    
 

блог.ejs

 <%- include("partials/head.ejs") -%>

    <h1><%=heading%></h1>
    <p><%=content%></p>

<%- include("partials/foot.ejs") -%>
 

ниже приведено сообщение об ошибке.

 events.js:352
      throw er; // Unhandled 'error' event
      ^

TypeError: Cannot read property 'title' of undefined
 

любая обратная связь о том, что я могу делать лучше, приветствуется.

обновление: я применил бандажное решение для этой проблемы, надеюсь, оно сохранится, код ниже;

 app.route("/toxic/:id")
.get(function(req,res){
    const route = req.params.id;

    lorem.findOne({_id: route}, function(err, foundPost){
        if(!err){
            res.render("blog",{
                heading: foundPost.title,
                content: foundPost.body,
            })
        }else{
            console.log("what the fuck!!")
        }
    })
})
 

проблема все еще существует, но приложение atlest не вылетает

Ответ №1:

Я думаю, что вы пытаетесь получить доступ к «foundPost.title», так как foundPost не определен, он выдает ошибку не может прочитать свойство undefined. Вы можете проверить, найдена ли какая-либо запись из БД или нет, прежде чем обращаться к свойству объекта.

Комментарии:

1. foundPost.title-это результат запроса lorem.findOne (), и в базе данных более нескольких записей. Как вы думаете, как мне следует определить найденный пост?

2. Я понимаю это, вы пробовали отлаживать? Вы уверены, что найденный пост не возвращается пустым или неопределенным?

3. да, у меня есть консоль. регистрируйте возврат, а также название и текст присутствуют

4. результат для блога, который я вижу в»/», но когда я пытаюсь отобразить полный блог внутри маршрута «/блог», все ссылки ломаются, и приложение выходит из строя