When I send a post request, the strings on the body are undefined

23 Views Asked by At

when trying to pass json data on the post endpoint, I get that the body is partialy undefined, it happen after I divided the api in diferent files, after that I get the ER_BAD_NULL_ERROR: Column 'User' cannot be null error, but unable to find the source of the error

 "dependencies": {
    "body-parser": "^1.20.2",
    "express": "^4.18.3",
    "mysql": "^2.18.1",
    "nodemailer": "^6.9.12",
    "nodemon": "^3.1.0",
    "routes": "^2.1.0"
  }
//Index.js

const express = require('express');
const userRoutes = require("./Routes/userRoutes");

const app = express();

// Middleware for parsing JSON body
app.use(express.json());
app.use(express.urlencoded({extended: true}));


// Use routes
app.use('/api/users', userRoutes);

// Start the server
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});
//userRoutes.js


const express = require('express');
const nodemailer = require('nodemailer');
const mysql = require('mysql');
const router = express.Router();
//var bodyParser = require('body-parser');
//router.use(express.json());
//router.use(express.urlencoded({extended: false}));
var error = 0;

// Define user routes

const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '123456',
    database: 'contacts'
  
  });
  
  // Middleware for sending emails
  const transporter = nodemailer.createTransport({
      service: 'Gmail',
      auth: {
        user: '',
        pass: ''
      }
    });
  
  // Functions here
  
  function ValidarInput(name, password, Google_Login, Apple_Login, Apple_Id, Saldo, ValorDevido, IS_Allowed ) {
  
      if (!name || !password || Google_Login == null || Apple_Login == null || !Apple_Id || Saldo == null || ValorDevido == null || IS_Allowed == null) {
          console.log("Failed to create user");
            
           
          }
      
  }
  
  //Functions here
  
  // Connect to MySQL
  connection.connect((err) => {
    if (err) {
      console.error('Error connecting to MySQL: ' + err.stack);
      return;
    }
    console.log('Connected to MySQL as id ' + connection.threadId);
  });
  
  // GET all users
  router.get('/', (req, res) => {
    connection.query('SELECT * FROM users', (error, results, fields) => {
      if (error) {
        console.error('Error retrieving users: ' + error);
        res.status(500).json({ message: 'Internal server error' });
        return;
      }
      res.json(results);
    });
  });
  
  router.get('/:id', (req, res) => {    
      connection.query(`SELECT * FROM users WHERE id = ${req.params.id}` , (error, results, fields) => {
          if (error) {
            console.error('Error retrieving users: ' + error);
            res.status(500).json({ message: 'Internal server error' });
            return;
          }
          res.json(results);
        });
    });
    
  
    router.post('/', (req, res) => {
      const { name, password, Google_Login, Apple_Login, Apple_Id, Saldo, ValorDevido, IS_Allowed } = req.body;
     
      ValidarInput(name, password, Google_Login, Apple_Login, Apple_Id, Saldo, ValorDevido, IS_Allowed);
      if (error != 0) {
          return res.status(400).json({ message: 'All fields are required' });
          
      }else{

        connection.query(`INSERT INTO users (User, Password, Google_Login, Apple_Login, Apple_Id, Saldo, ValorDevido, IS_Allowed) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,[name, password, Google_Login, Apple_Login, Apple_Id, Saldo, ValorDevido, IS_Allowed], (error, results, fields) => {
        if (error) {
          console.error('Error creating user: ' + error);
          res.status(500).json({ message: 'Internal server error' });
          return;
        }
        res.status(201).json({ id: results.insertId, name, password, Google_Login, Apple_Login, Apple_Id, Saldo, ValorDevido, IS_Allowed });
      });

      }      
    });
  
    // PATCH/UPDATE user by ID
    router.patch('/:id', (req, res) => {
      const userId = req.params.id;
      const { name, password, Google_Login, Apple_Login, Apple_Id, Saldo, ValorDevido, IS_Allowed } = req.body;
    
      let updateQuery = 'UPDATE users SET ';
      let updateFields = [];
      let updateValues = [];
    
      if (!name) {
        updateFields.push('User=?');
        updateValues.push(name);
      }
      
      if (Google_Login !== undefined) {
        updateFields.push('Google_Login=?');
        updateValues.push(Google_Login);
      }
      if (Apple_Login !== undefined) {
        updateFields.push('Apple_Login=?');
        updateValues.push(Apple_Login);
      }
      if (Apple_Id) {
        updateFields.push('Apple_Id=?');
        updateValues.push(Apple_Id);
      }
      if (Saldo !== undefined) {
        updateFields.push('Saldo=?');
        updateValues.push(Saldo);
      }
      if (ValorDevido !== undefined) {
        updateFields.push('ValorDevido=?');
        updateValues.push(ValorDevido);
      }
      if (IS_Allowed !== undefined) {
        updateFields.push('IS_Allowed=?');
        updateValues.push(IS_Allowed);
      }
    
      if (updateFields.length === 0) {
        return res.status(400).json({ message: 'No fields to update' });
      }
    
      updateQuery += updateFields.join(', ') + ' WHERE id=?';
      updateValues.push(userId);
    
      connection.query(updateQuery, updateValues, (error, results, fields) => {
        if (error) {
          console.error('Error updating user: ' + error);
          res.status(500).json({ message: 'Internal server error' });
          return;
        }
        res.json({ message: 'User updated successfully' });
      });
    });
  
    router.patch('/:id/passwordreset', (req, res) => {
      const userId = req.params.id;
      const { password } = req.body;
    
      let updateQuery = 'UPDATE users SET ';
      let updateFields = [];
      let updateValues = [];
    
      
      if (password !== undefined) {
        updateFields.push('Password=?');
        updateValues.push(password);
      }
    
      if (updateFields.length === 0) {
        return res.status(400).json({ message: 'No fields to update' });
      }
    
      updateQuery += updateFields.join(', ') + ' WHERE id=?';
      updateValues.push(userId);
    
      connection.query(updateQuery, updateValues, (error, results, fields) => {
        if (error) {
          console.error('Error updating user: ' + error);
          
          res.status(500).json({ message: 'Internal server error' });
          return;
        }
        res.json({ message: 'User updated successfully' });
      });
    });
    
    // DELETE user by ID
    router.delete('/:id', (req, res) => {
      const userId = req.params.id;
    
      connection.query('DELETE FROM users WHERE id = ?', userId, (error, results, fields) => {
        if (error) {
          console.error('Error deleting user: ' + error);
          res.status(500).json({ message: 'Internal server error' });
          return;
        }
        if (results.affectedRows === 0) {
          return res.status(404).json({ message: 'User not found' });
        }
        res.json({ message: 'User deleted successfully' });
      });
    });
  
    router.post('/send-email', (req, res) => {
      const { to, subject, text } = req.body;
    
      // Setup email data
      const mailOptions = {
        from: '[email protected]',
        to: to,
        subject: subject,
        text: text
      };
    
      // Send email
      transporter.sendMail(mailOptions, (error, info) => {
        if (error) {
          console.error('Error sending email:', error);
          res.status(500).send('Error sending email');
        } else {
          console.log('Email sent:', info.response);
          res.status(200).send('Email sent successfully');
        }
      });
    });

// Export router


module.exports = router;

It's suposed to insert in a mysql database, but cant pass the data

0

There are 0 best solutions below