【问题标题】:ReactJS + MySQL cannot create new object using api [duplicate]ReactJS + MySQL无法使用api创建新对象[重复]
【发布时间】:2021-01-25 21:40:15
【问题描述】:

我是 Web 开发的初学者,正在尝试使用 Mysql Express React Node.js 创建一个全栈项目。我尝试使用序列号(数据库的主键)、品牌和型号名称等参数创建新设备。当我在 Postman 中运行 api 时,它没有读取输入并从 Contoller js 给出消息(消息:“内容不能为空!”)

server.js

  const express = require("express");
  const bodyParser = require("body-parser");
  const cors = require("cors");

  const app = express();

  var corsOptions = {
    origin: "http://localhost:8081"
  };

  app.use(cors(corsOptions));

  // parse requests of content-type - application/json
  app.use(bodyParser.json());

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

  const db = require("./app/models");
  db.sequelize.sync();

  // simple route
  app.get("/", (req, res) => {
    res.json({ message: "Welcome " });
  });

  require("./app/routes/routes")(app);  

  // set port, listen for requests
  const PORT = process.env.PORT || 3000;
  app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}.`);
  });

controller.js(使用第一个create函数,报错:“内容不能为空!”)

const db = require("../models");
const Device = db.devices;
const Op = db.Sequelize.Op;

// Create and Save a new Devices
exports.create = (req, res) => {
  // Validate request
  if (!req.body.serialno) {
    res.status(400).send({
      message: "Content can not be empty!"
    });
    return;
  }

  // Create a Devices
  const device = {
    serialno: req.body.serialno,
    brand: req.body.brand,
    modelname: req.body.modelname 
  };

  // Save Devices in the database
  Device.create(device)
    .then(data => {
      res.send(data);
    })
    .catch(err => {
      res.status(500).send({
        message:
          err.message || "Some error occurred while creating the Devices."
      });
    });
};

// Retrieve all Devicess from the database.
exports.findAll = (req, res) => {

    const serialno = req.query.serialno;
    var condition = serialno ? { serialno: { [Op.like]: `%${serialno}%` } } : null;
  
    Device.findAll({ where: condition })
      .then(data => {
        res.send(data);
      })
      .catch(err => {
        res.status(500).send({
          message:
            err.message || "Some error occurred while retrieving Devicess."
        });
      });
  
};

// Find a single Devices with an id
exports.findOne = (req, res) => {

    const id = req.params.id;

    Device.findByPk(id)
      .then(data => {
        res.send(data);
      })
      .catch(err => {
        res.status(500).send({
          message: "Error retrieving Devices with id=" + id
        });
      });
  
};

// Update a Devices by the id in the request
exports.update = (req, res) => {
    const id = req.params.id;

  Device.update(req.body, {
    where: { id: id }
  })
    .then(num => {
      if (num == 1) {
        res.send({
          message: "Devices was updated successfully."
        });
      } else {
        res.send({
          message: `Cannot update Devices with id=${id}. Maybe Devices was not found or req.body is empty!`
        });
      }
    })
    .catch(err => {
      res.status(500).send({
        message: "Error updating Devices with id=" + id
      });
    });
};

// Delete a Devices with the specified id in the request
exports.delete = (req, res) => {

    const id = req.params.id;

    Device.destroy({
      where: { id: id }
    })
      .then(num => {
        if (num == 1) {
          res.send({
            message: "Devices was deleted successfully!"
          });
        } else {
          res.send({
            message: `Cannot delete Devices with id=${id}. Maybe Devices was not found!`
          });
        }
      })
      .catch(err => {
        res.status(500).send({
          message: "Could not delete Devices with id=" + id
        });
      });
  
};

// Delete all Devicess from the database.
exports.deleteAll = (req, res) => {
    Device.destroy({
        where: {},
        truncate: false
      })
        .then(nums => {
          res.send({ message: `${nums} Devicess were deleted successfully!` });
        })
        .catch(err => {
          res.status(500).send({
            message:
              err.message || "Some error occurred while removing all Devicess."
          });
        });
  
};


postman请求


http://localhost:3000/api/devices

{
    "serialno":123,
    "brand":"apple",
    "modelname":"XS"
}

model.js

module.exports = (sequelize, Sequelize) => {
    const Device = sequelize.define("device", {
      serialno: {
        type: Sequelize.INTEGER
      },
      brand: {
        type: Sequelize.STRING
      },
      modelname: {
        type: Sequelize.STRING
      }
    });
  
    return Device;
  };
  

路由 js

module.exports = app => {
    const devices = require("../controllers/controller.js");
  
    var router = require("express").Router();
  
    // Create a new devicesial
    router.post("/", devices.create);
  
    // Retrieve all devices
    router.get("/", devices.findAll);
  
    // Retrieve all published devices

  
    // Retrieve a single deviceswith id
    router.get("/:id", devices.findOne);
  
    // Update a deviceswith id
    router.put("/:id", devices.update);
  
    // Delete a deviceswith id
    router.delete("/:id", devices.delete);
  
    // Delete all devices
    router.delete("/", devices.deleteAll);
  
    app.use('/api/devices', router);
  };

【问题讨论】:

  • 邮递员显示什么错误??
  • @Arya 很抱歉,我看到这里发生了什么,你以为邮递员给出了一个实际错误,但它给出了消息(消息:“内容不能为空!”)我的错应该指定我道歉
  • 你检查过你输入的数据和他们的名字
  • 你能用routes.js文件的内容更新你的问题吗?
  • @padaleiana 我添加了路由文件

标签: javascript mysql node.js express sequelize.js


【解决方案1】:

我认为您在 postman 中没有收到回复,因为您在发送回数据或错误消息之前忘记使用 return 作为响应

const db = require("../models");
const Device = db.devices;
const Op = db.Sequelize.Op;

// Create and Save a new Devices
exports.create = (req, res) => {
  // Validate request
  if (!req.body.serialno) {
  return  res.status(400).send({
      message: "Content can not be empty!"
    });
  }

  // Create a Devices
  const device = {
    serialno: req.body.serialno,
    brand: req.body.brand,
    modelname: req.body.modelname 
  };

  // Save Devices in the database
  Device.create(device)
    .then(data => {
    return  res.send(data);
    })
    .catch(err => {
    return  res.status(500).send({
        message:
          err.message || "Some error occurred while creating the Devices."
      });
    });
};

您必须在控制器文件中的每个 api 响应之前写 return 签出此 doc 以了解 node.js 开发人员的常见错误。

【讨论】:

  • 仍然显示相同的消息{ "message": "Content can not be empty!" }
  • 你检查过你在邮递员中所做的条目
  • 这里是请求` { "serialno":123, "brand":"apple", "modelname":"XS" } `
  • 您是否尝试在""中添加序列号
  • 是的,我试过了,还是没有进展
猜你喜欢
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 2018-05-25
相关资源
最近更新 更多