Сохранение входного значения параметра select в компоненте React внутри MongoDB — сбой MERN. Сохраняет его как пустую строку

#node.js #reactjs #mongodb #express #mern

#node.js #reactjs #mongodb #выразить #mern

Вопрос:

Я работаю с MERN и пытаюсь сохранить входные значения параметра выбора в моей базе данных MongoDB с помощью mongoose. Вот так

 import React, {Component} from 'react';
import axios from 'axios';

class Admin extends Component {
    constructor(props) {
        super(props)

        //setting initial states
        this.state= {
            college: ''
        }
    }

onChangeCollege=(event)=>{
        this.setState({college: event.target.value})
    }

 onSubmit =(event) =>{
        event.preventDefault()

        console.log('Form Submitted')

        const newCourse = {
            college:this.state.college
        }

        axios.post('http://localhost:8000/courses/admin', newCourse)
            .then(response => console.log(response.data))
            .catch(() => console.log('Error creating new course'))

        this.setState({
            college: ''
                    })
    }

   

    render(){
        
    return (
        <div className="space3">
            <h3>Add a Course to the Database</h3>
        <form autoComplete="on" onSubmit={this.onSubmit} className="space"> 
            <div className="form-group">
                 <label htmlFor="exampleInputEmail1">COLLEGE</label>
                     <select className="custom-select" id="inputGroupSelect01" >
                        <option defaultValue>Choose...</option>
                        <option value={this.state.college} onChange={this.onChangeCollege} > College of 
 Agricultural and Environmental Sciences </option>
                        <option value={this.state.college} onChange={this.onChangeCollege} > College of Humanities and Social Sciences </option>
                        <option value={this.state.college} onChange={this.onChangeCollege} > College of Education and External Studies </option>
                        <option value={this.state.college} onChange={this.onChangeCollege} > College of Health Sciences </option>
                        <option value={this.state.college} onChange={this.onChangeCollege} > College of Natural Sciences </option>
                        <option value={this.state.college} onChange={this.onChangeCollege} > College of Business and Management Studies </option>
                        <option value={this.state.college} onChange={this.onChangeCollege} > College of Engineering, Design,  Art and Technology </option>
                        <option value={this.state.college} onChange={this.onChangeCollege} > College of Veterinary Medicine, Animal Resources and Bio-Security </option>
                        <option value={this.state.college} onChange={this.onChangeCollege} > School of Law </option>
                    </select>
 </div>
<button type="submit" className="btn btn-primary">Submit</button>

            </form>
            </div>
    )
    }
}

export default Admin;
  

мой серверный сервер — Nodejs, который выглядит следующим образом.
МОДЕЛЬ

 const mongoose = require('mongoose')

const Courses = new mongoose.Schema({
    college: {
        type:String
    }  
})

module.exports = mongoose.model('coursesmodel', Courses)
  

API

 const express = require ('express')
const router = express.Router()
const coursedb = require('../models/coursedb')

//add new todo to list
router.post('/admin', (request, response) => {
    const list = new coursedb({
        college: request.body.college
    })

    list.save()
    .then(courses => {response.json(courses)})
    .catch(error => {response.json(error)})
})
 
module.exports = router
  

Как вы можете видеть в моей консоли, это последняя консоль.журнал возвращает пустую строку для значения КОЛЛЕДЖА.

Как вы можете видеть в моей консоли, это последняя консоль.журнал возвращает пустую строку для значения КОЛЛЕДЖА.

И вот как это выглядит в моем MongoDB.

И вот как это выглядит в моем MongoDB.

Как мне сохранить этот параметр выбора ввода КОЛЛЕДЖА в моей БД в виде строки, как и остальные, а не пустой строки. Нужна помощь!

Комментарии:

1. вы уверены, что this.state.college не является пустой строкой? все значение вашего параметра установлено на this.state.college

Ответ №1:

В состоянии college это пустая строка, а в коде JSX value для каждого параметра есть this.state.college , т.Е. Пустая строка, и в этом заключается ваша проблема.

Всякий onChangeCollege() раз, когда срабатывает, event.target.value это значение value атрибута option элемента, который вызвал onChange событие, и в вашем случае this.state.college это пустая строка, и это то, что вы отправляете на сервер при отправке формы.

value атрибут option элемента должен быть равен значению параметра, который виден пользователю. Например, вам нужно изменить

 <option
  value={this.state.college}
  onChange={this.onChangeCollege}
>
  College of Humanities and Social Sciences
</option>
  

Для

 <option
  value="College of Humanities and Social Sciences"
  onChange={this.onChangeCollege}
>
  College of Humanities and Social Sciences
</option>
  

Вам нужно сделать это для всех option элементов.


Примечание: вам не нужно добавлять отдельный onChange прослушиватель для каждого option , добавление onChange прослушивателя событий для select элемента приведет к тому же результату.

 <select
  className="custom-select"
  id="inputGroupSelect01"
  onChange={this.onChangeCollege} 
>
  ...
</select>
  

Если вы хотите знать, почему это работает, см.: MDN - Event Bubbling

Комментарии:

1. Ваше решение полностью сработало!. Большое вам спасибо @yousaf . Я так рад, что теперь эта ошибка прошла.