Когда я делаю публикацию, данные не сохраняются в MongoDB, сохраняется только _ID

#express #mongoose

#экспресс #мангуст

Вопрос:

Я хотел сохранить данные в MongoDB. Я использую открытую схему (без ограничений). Если я выполняю запрос POST, сохраняется только _ID. Я не получаю ошибок, но данные, которые я передаю, игнорируются.

Я новичок в mongoose. Я читал документы, но не мог точно определить, где я допускаю ошибку.

моя схема:

 var Schema = mongoose.Schema;
var product = new Schema({any: {}});
var Product = mongoose.model('Product',product)
  

мой запрос POST:

 app.post('/input',function(request,response) {
    var product = new Product(request.body);    
    product.save(function(err,saved) {
        if (err) {
            response.send({error:"could not save"});
        } else  {
            response.send(saved);
        }
    })
})
  

Что сохраняется в MongoDB:

 {
    "_id": "5ca8c6ada7827b6f64c603bf",
    "__v": 0
}
  

Мой ввод:

 {
    "name":"xmen",
    "age":25
}
  

Пожалуйста, дайте мне знать, если потребуются какие-либо другие детали.

Ответ №1:

Вы передаете request.body своему конструктору. request.body в вашем коде есть объект с 2 свойствами : name: "xmen" и age: 25 . Однако ваш Schema содержит только одно свойство: any: {} ( {} означает, что вы принимаете любой тип данных). когда вы передаете request.body в var product = new Product(request.body); , вы передаете объект с 2 свойствами конструктору, который ожидает объект с одним именем any , поэтому, когда конструктор не находит, он возвращает объект только с _id . если вы предоставляете :

   { any:"xmen"}
  

или

   {
    any: {
      "name":"xmen",
      "age":25
    }
  }
  

вы получите ожидаемые результаты.

Ответ №2:

Вы сталкиваетесь с этим, потому что ваша схема Mongoose не знает о свойствах, которые она должна хранить в документе.

Вы использовали any в качестве ключа в своем определении схемы, что, я полагаю, вы сделали, потому что вы следовали разделу SchemaTypes в документации.

any не означает, что какое-либо свойство является приемлемым. Это означает, что Mongoose ищет значение с ключом «any», буквально. Если тело вашего запроса не содержит такого ключа (а это не так, поскольку оно содержит только имя и возраст), оно не будет получено при сохранении нового объекта.

То, что вы испытываете, — это ожидаемое поведение Mongoose.

Определение схемы

MongoDB гибок в своих структурах документов. Однако, когда вы определяете новую схему, вы также должны определить все возможные свойства и их типы (вы также можете использовать {} в качестве типа для поддержки любого типа — хотя это не рекомендуется).

Вы можете определить свою схему следующим образом:

 {
    name: String,
    age: Number
}
  

Это означает, что при вызове .save() вашего нового объекта Mongoose выберет только указанные свойства в схеме (а также _id и __v , которые существуют в любой схеме по умолчанию).


Подробнее о схемах Mongoose читайте здесь.

Ответ №3:

  1. В принципе, если вы попытаетесь проверить и консольно зарегистрировать свой req.body or request.body , тогда вы можете получить undefined . Итак, вам нужно проверить, записали ли вы это в файл или нет.

    app.use(express.json())

это определяет ваши данные как данные json.

  1. Эта вторая проверка также связана с первой, так как убедитесь, что вы выбрали JSON в качестве типа вашего тела при отправке запроса POST с использованием таких инструментов, как postman и т.д.

Оба они сработали в моем случае 🙂