javascript - 使用未定义的数据库列中的快速结果将 html 形式的数据发送到 mysql 数据库

标签 javascript html node.js rest express

我的主要目标是使用 Node.js 创建一个 RestAPI 并在小型 HTML 应用程序中测试它。

我的老师通过示例帮助我们创建了 RestAPI,我能够将其适配到我自己的 MySQL 数据库,并且我已经使用 Visual Studio Code 上的 Thunder Client 扩展测试了 API 的每个端点,并且它工作正常.

但是我在测试 html 应用程序时遇到了问题。我正在尝试使用表单发送一些数据,但在我提交时它不会保存我放入表单中的任何数据,而是将空值插入所有列。我知道端点是正确的,因为它真正连接到正确的函数和表,并将新的数据行插入到表中。

这是我的 HTML 表单

<!DOCTYPE html>

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
   
    <title>Header</title>

    <link rel="stylesheet" href="css/styles.css">
    </head>
<body>

    <h1 id="teste"> Adicionar um Videojogo</h1>
    <form action=" http://localhost:3000/api/videogames" method="post" enctype="multipart/form-data"  >

        <div class="form-item col" id="form_">
                    <input type="text" name= "nome" id="nome" placeholder="Nome" required= "required">
                    </div>
        <div class="form-item" id="form_">
                    <input type="text" name= "produtora" id="produtora" placeholder="Produtora" required= "required">               
                    </div>
        <div class="form-item" id="form_">
                   <input type="text" name= "distribuidora" id="distribuidora" placeholder="Distribuidora" required= "required">
                    </div>
        <div class="form-item" id="form_">
                   <input type="text" name= "ano" id="ano" placeholder="Ano" required= "required">
    
                   </div>

这是我的模型:

const sql = require("./db.js");

// construtor
const Videogame = function(videogame) {
  this.nome = videogame.nome;
  this.produtora = videogame.produtora;
  this.distribuidora = videogame.distribuidora;
  this.ano = videogame.ano;
  this.id_genero= videogame.id_genero;
  this.id_plataforma = videogame.id_plataforma;
}

Videogame.insert = (newVideogame, result) => {
  sql.query('INSERT INTO videogame SET ?', newVideogame, (err, res) => {
    if (err) {
      console.log('error: ', err);
      result(err, null);
      return;
    }

    console.log("Videojogo inserido: ", { id: res.insertId, ...newVideogame });
    result(null, { id: res.insertId, ...newVideogame});
  });
}

我的 Controller :

const Videogame = require("../models/videogame.model.js");

// Inserir um novo videojogo
exports.insert = (req, res) => {
    // Validar a request
    if (!req.body) {
      res.status(400).send({
        message: "O conteúdo do videojogo deve estar definido."
      });
    }
  
    // Criar um "Videogame"
    const videogame = new Videogame({
      nome: req.body.nome,
      produtora: req.body.produtora,
      distribuidora: req.body.distribuidora,
      ano: req.body.ano,
      id_genero: req.body.id_genero,
      id_plataforma: req.body.id_plataforma,
    });
  
    // Guardar "Videogame" na base de dados
    Videogame.insert(videogame, (err, data) => {
      if (err)
        res.status(500).send({
          message:
            err.message || "Ocorreu um erro ao inserir o videojogo..."
        });
      else res.send(data);
           
    });
  };

我的路线:

module.exports = app => {
    const videogames = require("../controllers/videogame.controller.js");
  
    var router = require("express").Router();
  
    // Consultar todos os videojogos
    router.get("/", videogames.selectAll);
  
    // Consultar um videojogos pelo id
    router.get("/:id", videogames.findById);
  
    // Inserir um novo videojogo
    router.post("/", videogames.insert);
  
    // Atualizar um videojogo pelo id
    router.put("/:id", videogames.update);
  
    // Apagar um videojogo pelo id
    router.delete("/:id", videogames.delete);
  
    // Apagar todos os videojogos
    router.delete("/", videogames.deleteAll);
  
    app.use('/api/videogames', router);
  };

我的服务器:

const express = require('express');
const cors = require('cors');

const app = express();
const PORT = process.env.PORT || 3000;
const corsOptions = {
  origin: 'http://localhost'
};

app.use(cors(corsOptions));

// tratamento (parse) de pedidos de content-type - application/json
app.use(express.json());

// tratamento (parse) de pedidos de content-type - application/x-www-form-urlencoded
app.use(express.urlencoded({ extended: true }));

/*// route de "entrada" - apenas para efeito de teste
app.get("/", (req, res) => {
  res.json({ message: "Movies API . IPVC" });
});*/

// importação das videogames.routes com um argumento de inicialização
require('./app/routes/videogames.routes.js')(app);

// ativação do servidor, onde serão recebidos os pedidos, na porta definida
app.listen(PORT, () => {
  console.log(`Servidor ativo na porta ${PORT}.`);
});

它连接到数据库,但无论如何这是数据库连接

const mysql = require('mysql');
const DBConfig = require('../config/db.config.js');

// Criar conexão à base de dados
const connection = mysql.createConnection({
  host: DBConfig.DBSERVER,
  user: DBConfig.DBUSER,
  password: DBConfig.DBPASS,
  database: DBConfig.DBNAME
});

// Abrir conexão à base de dados
connection.connect(error => {
  if (error) throw error;
  console.log('Ligação à base de dados estabelecida...');
});

module.exports = connection;

这是我提交表单后出现在终端上的结果

Videojogo inserido:  {
  id: 14,
  nome: undefined,
  produtora: undefined,
  distribuidora: undefined,
  ano: undefined,
  id_genero: undefined,
  id_plataforma: undefined
}

它应该保存表单中的数据而不是 undefined(我的表单中还有 id_genero 和 id_plataforma 的 2 个单选按钮,但我只将其他输入放在这里,因为我没有不要认为问题出在单选按钮上,就好像它会在表单中分配其他输入值一样。)

最佳答案

您正在使用 express.json() 但您的表单数据不是 JSON 格式。

您可以安装express-formidable在你的应用程序文件夹中使用 npm

然后您需要使用它创建中间件,如下所示:

// in app.js
const formidableMiddleware = require('express-formidable');
//...

// Note that req.fields will be instead of req.body due to middleware
// used to handle json, forms, and uploading files
app.use(formidableMiddleware(
  {
    encoding: 'utf-8',
    // means multi files (array of files) in one request
    multiples: true, 
  }
));

您需要将 app.use(express.json()); 替换为上面的代码片段

您还可以检查an example from ExpressJS repo on github对于多部分表单

关于javascript - 使用未定义的数据库列中的快速结果将 html 形式的数据发送到 mysql 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70690161/

相关文章:

node.js - 如何在 sails.js 模型中添加具有整数数据类型数组的属性?

node.js - 电商网站paypal如何查看订阅支付状态

html - 如何排序此 HTML 表格的位置? - 我需要右侧的提交按钮,并且需要删除左侧的间距

javascript - 窗口关闭();不能在 Firefox 中工作

javascript - Html - 模态图像顶部的半透明 div

javascript - 由于数字周围的引号,node.js mysql 查询无法运行

javascript - Babel 插件(访问者模式)——它是如何工作的

javascript - Lodash 或 JS GroupBy 和数组数组的计数

javascript - 按字母顺序对数组进行排序Javascript

javascript - 使用 xml 中该元素的值定位一个元素及其下的其他元素