#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:
-
В принципе, если вы попытаетесь проверить и консольно зарегистрировать свой
req.body
orrequest.body
, тогда вы можете получитьundefined
. Итак, вам нужно проверить, записали ли вы это в файл или нет.app.use(express.json())
это определяет ваши данные как данные json.
- Эта вторая проверка также связана с первой, так как убедитесь, что вы выбрали JSON в качестве типа вашего тела при отправке запроса POST с использованием таких инструментов, как postman и т.д.
Оба они сработали в моем случае 🙂