解决快递请求中的 UnhandledPromiseRejectionWarning

Posted

技术标签:

【中文标题】解决快递请求中的 UnhandledPromiseRejectionWarning【英文标题】:Resolving UnhandledPromiseRejectionWarning in express post request 【发布时间】:2019-10-25 23:50:27 【问题描述】:

我正在尝试向服务器 (mongodb) 发出 post 请求,但出现此错误:

UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“todo_description”

我在本地主机上运行 mongodb

// Require Express
const express = require("express");

// Setting Express Routes
const router = express.Router();

// Set Up Models
const Todo = require("../models/todo");

// Get All Todos
router.get("/", async (req, res) => 
  try 
    const todo = await Todo.find();
    res.json(todo);
   catch (err) 
    res.json( message: err );
  
);

router.get("/:id", async (req, res) => 
  try 
    const id = req.params.id;
    await Todo.findById(id, (err, todo) => 
      res.json(todo);
    );
   catch (err) 
    res.json( message: err );
  
);

router.post("/add", async (req, res) => 
  const todo = new Todo(
    todo_description: req.body.todo_description,
    todo_responsible: req.body.todo_responsible,
    todo_priority: req.body.todo_priority,
    todo_completed: req.body.todo_completed,
  );

  try 
    await todo.save();
    res.json(todo);
   catch (err) 
    res.json( message: err );
  
);

router.patch("/update/:id", async (req, res) => 
  try 
    const updateTodo = await Todo.updateOne(
       _id: req.params.id ,
       $set:  todo_description: req.body.todo_description  
    );
    updateTodo.save().then(updateTodo => 
      res.json(updateTodo);
    );
   catch (err) 
    res.json( message: err );
  
);

router.delete("/delete/:id", async (req, res) => 
  try 
    const deleteTodo = await Todo.deleteOne( _id: req.params.id );
    res.json(deleteTodo);
   catch (err) 
    res.json( message: err );
  
);

module.exports = router;

我的待办事项模型

// Require Mongoose
const mongoose = require("mongoose");

// Define Schema
// const Schema = new mongoose.Schema;

// Define Todo-Schema
const TodoSchema = new mongoose.Schema(
  // Creating Fields
  todo_description: 
    type: String
  ,
  todo_responsible: 
    type: String
  ,
  todo_priority: 
    type: String
  ,
  todo_completed: 
    type: Boolean
  ,
  todo_date: 
    type: Date,
    default: Date.now
  
);

// Compile Model From Schema
// const TodoModel = mongoose.model("Todos", TodoSchema);

// Export Model
module.exports = mongoose.model("todos", TodoSchema);

错误信息:

(节点:548)UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“todo_description” 在 router.post (C:\Users\kinG\Desktop\projects\mountain-of-prototype\mern\backend\routes\todo.js:33:32) 在 Layer.handle [as handle_request] (C:\Users\kinG\Desktop\projects\mountain-of-prototype\mern\backend\node_modules\express\lib\router\layer.js:95:5)

谢谢

【问题讨论】:

你使用body-parser吗? 是的,尝试 get 方法说这在发送给客户端后无法设置标题希望你不介意这些问题是后端的新手 对不起,这是我的旧评论,比给出的答案更早,已经解决了您的问题。顺便说一句,您现在是在谈论一个新错误吗?那么是时候开始一个新的问题了。确保在您的新问题中包含所有相关代码(因此,切勿在一个问题中要求两个或更多内容。提出的每个问题只有一个目标 - 只是试图帮助您避免其他人的反对意见)。欢迎来到这里,不要让一些潜在的负面事件让你灰心——尤其是。要非常小心你如何提问和回答(放松,你会掌握它的窍门)。祝你一切顺利,伙计。 【参考方案1】:

您正在从req.body 访问todo_descriptionreq.body 仅在您添加 body-parser 中间件或自己添加类似中间件时可用。

在你的路线加载之前添加这个:

const bodyParser = require('body-parser');
const express = require('express');

const app = express();

app.use(bodyParser.json());

您也可以将此添加到特定路线。阅读更多关于它的信息here。

【讨论】:

是的,我正要这么说。但先评论以确保。有我的赞成票 :) 你是最好的人,非常感谢。在加载路由之前总是会调用 bodyparser.json 谢谢【参考方案2】:

您应该在应用程序的主文件中使用 body-parser。在您的中间件解析主体之前,它会为您提供解析的 json,默认情况下是字符串。并确保您在 req.body 中发送 todo_description(使用前应检查)。

const bodyParser = require('body-parser');
app.use(bodyParser.json()); 

【讨论】:

以上是关于解决快递请求中的 UnhandledPromiseRejectionWarning的主要内容,如果未能解决你的问题,请参考以下文章

无法在我的快递应用中解决 CORS 政策

电商电子面单设置-快递鸟API接口

蓝鸟承诺在快递路线解决

快递100-快递信息查询订阅推送/跟踪API接口案例代码

快递100,ajax请求

如何在快递请求期间更改 req.body