Как определить схему и экспресс-маршрутизатор в стеке MERN? - PullRequest
0 голосов
/ 08 декабря 2018

мне нужно работать с такой записью mongodb:

{
    "_id": {
        "$oid": "5c09ae281646e8d8bad07d73"
    },
    "name": "somename",
    "genre": "somegenre",
    "indexes": {
        "index1": 1,
        "index2": 7,
        "index3": 7,
        "index4": 7,
        "index5": 7,
        "index6": 7,
        "index7": 7,
        "index8": 7,
        "index9": 7,
        "index10": 7,
        "index11": 7,
        "index12": 9,
        "index13": 5,
        "index14": 15,
        "index15": 8,
        "index16": 17
    },
    "date": {
        "$date": "2018-12-06T23:18:00.532Z"
    },
    "__v": 0
}

И я задаю схему для mongoose вот так

const ItemSchema = new Schema({
  name: {
    type: String,
    required: true
  },
  genre: {
    type: String,
    required: true
  },
  indexes: {
    type: Object,
    required: true,
    properties: {
      index1: {
        type: Number,
        required: true
      },
      index2: {
        type: Number,
        required: true
      },
      index3: {
        type: Number,
        required: true
      },
      index4: {
        type: Number,
        required: true
      },
      index5: {
        type: Number,
        required: true
      },
      index6: {
        type: Number,
        required: true
      },
      index7: {
        type: Number,
        required: true
      },
      index8: {
        type: Number,
        required: true
      },
      index9: {
        type: Number,
        required: true
      },
      index10: {
        type: Number,
        required: true
      },
      index11: {
        type: Number,
        required: true
      },
      index12: {
        type: Number,
        required: true
      },
      index13: {
        type: Number,
        required: true
      },
      index14: {
        type: Number,
        required: true
      },
      index15: {
        type: Number,
        required: true
      },
      index16: {
        type: Number,
        required: true
      }
    }
  },

их мой пост роутера (экспресс)

router.post("/", (req, res) => {
  const newItem = new Item({
    name: req.body.name,
    genre: req.body.genre,
    indexes: {
      index1: req.body.indexes.index1,
      index2: req.body.indexes.index2...

их входы для установки значений индекса (где я использую свойство name, чтобы определить, как я буду устанавливать новый элемент):

  <input
    type="text"
    name="indexes.index1"
    placeholder="sample 1"
    onChange={this.onChange}
  />

и функции

  onChange = e => {
    this.setState({ [e.target.name]: e.target.value });
  };

и

onSubmit = e => {    
    const newItem = {
      name: this.state.name,
      genre: this.state.genre,
      indexes: {
        index1: this.state.indexes.index1,
...

результат их в MongoDB:

{
    "_id": {
        "$oid": "5c0c22d41e3d5115dda930aa"
    },
    "name": "name",
    "genre": "somegen",
    "indexes": {
        "index1": "",
        "index2": ""

нет значений в индексах Есть идеи?предложения?

Спасибо, ребята.Seba

1 Ответ

0 голосов
/ 08 декабря 2018

Проблема заключается в вашем setState вызове ReactJS.

onChange = e => {
    this.setState({ [e.target.name]: e.target.value });
};

target.name всегда является строкой, поэтому вы устанавливаете свойство с ключом, который содержит. (indexes.index1), поэтому ваше состояние после события onChange будет выглядеть следующим образом:

state = {
    "name": "name",
    "genre": "somegen",
    "indexes.index1": "1",
    "indexes.index2": "2",
    ...
}

Это не распознается express, и ваш запрос не может доставить правильное тело.

Вы можете достичь желаемого, если индексы каким-то образом преобразовать в объект.Самый простой способ настройки:

onChange = e => {

    if ( e.target.name.indexOf( "indexes" ) === 0 ) {
        this.setState({ indexes: Object.assign( this.state.indexes || {}, {
            [e.target.name.replace(/^indexes\./, "")]: e.target.value
        } ) } );
    } else {
        this.setState({ [e.target.name]: e.target.value });
    }
};

Если позволяет структура вашего приложения, вы можете переместить входные данные, которые определяют индексы в другом компоненте, который будет иметь в качестве обратного вызова весь объект indexN.Это поможет вам просто обновить состояние, не анализируя ключ индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...