【问题标题】:Validation error on Postman though field inputs are given尽管给出了字段输入,但邮递员上的验证错误
【发布时间】:2022-01-10 11:25:58
【问题描述】:

正在制作一个 RESTful API 并按预期工作。我正在使用邮递员和 mongodb,并请求解决。 但是现在只有 Delete 和 Get 请求有效,Update 和 create 请求返回这些“字段是必需的”,尽管它们不是空的。 在我添加路由器之前,这一切正常。

const express = require("express");
require("./db/conn");
const Student = require("./models/students");
const studentRouter = require("./routers/stds");

// Environment Variables
const app = express();
const port = process.env.PORT || 8000;

// Calling Router
app.use(studentRouter);

// Middleware
app.use(express.json());

// Listening to port 
app.listen(port, () => {
  console.log(`Connection at ${port}`);
});

// Creating Router
const express = require("express");
const router = new express.Router();
const Student = require("../models/students");

// Creating URLs
router.get("/", (req, res) => {
  res.send("Hello World");
});

// Creating data
router.post("/students", async (req, res) => {
  try {
    const user = new Student(req.body);
    const createUser = await user.save();
    console.log(createUser);
    res.status(201).send(createUser);
  } catch (e) {
    res.status(400).send(e);
  }
});

// Reading data
router.get("/students", async (req, res) => {
  try {
    const studentsData = await Student.find();
    if (!studentsData) {
      return res.status(404).send();
    } else {
      res.send(studentsData);
    }
  } catch (e) {
    res.send(e);
  }
});

// Reading data using IDs
router.get("/students/:id", async (req, res) => {
  try {
    const _id = await req.params.id;
    const studentData = await Student.find({ _id });
    res.send(studentData);
  } catch (e) {
    res.status(500).send(e);
  }
});

// Update Student's Data by ID
router.patch("/students/:id", async (req, res) => {
  try {
    const _id = req.params.id;
    const updateStudents = await Student.findByIdAndUpdate({ _id },
      req.body,
      {
        new: true
      });
    res.send(updateStudents);
  } catch (e) {
    res.status(400).send(e);
  }
});

// Delete Student's Data by I
router.delete("/students/:id", async (req, res) => {
  try {
    const id = req.params.id;
    const deleteStudent = await Student.findByIdAndDelete({ id });
    if (!id) {
      return res.status(400).send();
    }
    else {
      res.send(deleteStudent);
    }
  } catch (e) {
    res.status(500).send(e);
  }
})

module.exports = router; 

我的架构文件。

const mongoose = require("mongoose");
const validator = require("validator");

const studentSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    minlength: 3
  },
  email: {
    type: String,
    required: true,
    unique: [true, "Already Exists"],
    validate(value) {
      if (!validator.isEmail(value)) {
        throw new Error("Invalid Email")
      }
    }
  },
  phone: {
    type: Number,
    minlength: 10,
    required: true,
    unique: true
  },
  address: {
    type: String,
    required: true
  }
});

// creating new collection using model
const Student = new mongoose.model("Student", studentSchema);

module.exports = Student;

Inputs are given but it doesn't takes it as one

如果需要更多信息,请询问...

【问题讨论】:

  • 当你console.log(req.body)时它会打印什么?
  • @JakeJackson 控制台中没有任何内容:(
  • @JakeJackson 我在更新请求时做了console.log(req.body),但未定义。
  • 这是否与它在 Postman 上以 raw 而不是 JSON 发送的事实有关?
  • 实际上,在我添加路由器并将我的请求从 app.js 移动到 stds.js 之前,它工作得很好,而且我猜它是作为 JSON 数据发送的。

标签: javascript node.js express mongoose api-design


【解决方案1】:

您正在将数据发送到您的路由器而没有先解析它。

// Calling Router
app.use(studentRouter);

// Middleware
app.use(express.json());

这应该是另一种方式

// Middleware
app.use(express.json());

// Calling Router
app.use(studentRouter);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2017-08-03
    相关资源
    最近更新 更多