简体   繁体   中英

UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'title' of undefined

I believe the error is pointing to the router.post("/", .... post below.

I am using JavaScript, express, ejs, mongoDB.

The purpose of this post is to allow you to save a blog post (confusing choice of words I know), which will then redirect you to the main page ("/"). I am fairly new, any help is appreciated!!

const express = require("express");
const Post = require("../models/post");
const router = express.Router();

// app.set("view engine", "ejs");

router.get("/new", (req, res) => {
  res.render("posts/new", { post: new Post() });
});

router.get("/:id", async (req, res) => {
  const post = await Post.findById(req.params.id);
  if (post == null) res.redirect("/");
  res.render("posts/show", { post: post });
});

router.post("/", async (req, res) => {
  let post = new Post({
    title: req.body.title,
    description: req.body.description,
    link: req.body.link,
  });
  try {
    post = await post.save();
    res.redirect(`/posts/${post.id}`);
  } catch (error) {
    console.log("failure to create new post");
    res.render("posts/new", { post: post });
  }
});

module.exports = router;

**EDIT #1 - The below code is my server.js file that I believe is relevant to the error **

const express = require("express");
const mongoose = require("mongoose");
const Post = require("./models/post");
const PostModel = require("./models/post");
const postRouter = require("./routes/post");
const app = express();
require("dotenv").config();

app.set("view engine", "ejs");

const connect = () => {
  const un = process.env.MONGO_USER;
  const pw = process.env.MONGO_PASSWORD;
  return mongoose.connect(
    `mongodb+srv://${un}:${pw}@personalblog.b6isg.mongodb.net/PersonalBlog?retryWrites=true&w=majority`,
    { useNewUrlParser: true, useUnifiedTopology: true }
  );
};
connect().then(async (connection) => {
  const createdPost = Post.create();
  console.log(createdPost);
  console.log(connect());
});

app.get("/", async (req, res) => {
  const post = await Post.find().sort({ createdAt: "desc" });
  res.render("posts/index", { post: post });
});

app.use("/posts", postRouter);

app.use(express.urlencoded({ extended: false }));
app.listen(4000);

The req.body is coming as undefined in your router which is causing this issue.

In your app.js, try adding :

app.use(bodyParser.urlencoded({
    extended: true
}))
app.use(bodyParser.json())

and send the request again.

base on your coding, you use body that known as json request

router.post("/", async (req, res) => {
  let post = new Post({
    title: req.body.title,
    description: req.body.description,
    link: req.body.link,
  });
  try {
    post = await post.save();
    res.redirect(`/posts/${post.id}`);
  } catch (error) {
    console.log("failure to create new post");
    res.render("posts/new", { post: post });
  }
});

so in your server js, register middleware for json instead

// urlencoded parsing
app.use(express.urlencoded({ extended: false }));
// json parsing
app.use(express.json());

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM