В настоящее время у меня есть следующая функция Мангуста в вызове API hapi.js
server.route({
method: "PUT",
path:"/api/blockinfo/{hash}",
handler: async (request, h) => {
try{
var jsonPayload = JSON.parse(request.payload)
console.log(jsonPayload)
var result = await BlockModel.findOneAndUpdate(request.params.hash, {$set: { height : jsonPayload[Object.keys(jsonPayload)[0]]}}, {new: true});
return h.response(result);
}catch{
return h.response(error).code(500);
}
}
})
Его цель в основном обновить значение, используя PUT
. В случае выше, он обновит высоту поля и будет работать нормально.
Но что, если я хочу обновить произвольное поле?
Например, мой формат объекта следующий:
{"_id":"5cca9f15b1b535292eb4e468", "hash":"d6e0fdb404cb9779a34894b4809f492f1390216ef9d2dc0f2ec91f95cbfa89c9", "height":301651, "size":883, "time":1556782336, "__v":0}
В приведенном выше случае я обновил значение высоты с помощью $set
, но что, если я решу ввести 2 случайных поля для обновления, например, размера и времени.
Это будет мой вклад в почтальон:
{
"size": 300,
"time": 2
}
Ну, очевидно, это не будет работать в коде выше, потому что эти поля отсутствуют в наборе.
Так как мне сделать этот набор для автоматического распознавания того, что нужно обновить?
Я попытался упростить его с помощью следующего кода, но он ничего не обновит
server.route({
method: "PUT",
path:"/api/blockinfo/{hash}",
handler: async (request, h) => {
try{
var result = await BlockModel.findOneAndUpdate(request.params.hash, request.payload, {new: true});
return h.response(result);
}catch{
return h.response(error).code(500);
}
}
})
Схема
const BlockModel = Mongoose.model("blocks", {
hash: String,
height: Number,
size: Number,
time: Number
});
3 ответа
handler: async (request, h) => {
try{
var result = await BlockModel.findOneAndUpdate(request.params.hash, JSON.parse(request.payload ), {new: true});
return h.response(result);
}catch{
return h.response(error).code(500);
}
}
Поскольку мы обновляем JSON, данные должны быть в формате JSON.
Проблема в вашем ключе hash
. Первый параметр / аргумент в функции findOneAndUpdate
должен быть парой key
value
. И здесь вы прямо ставите key
.
Так и должно быть
handler: async (request, h) => {
try {
const { hash } = request.params
var result = await BlockModel.findOneAndUpdate({ hash }, request.payload, { new: true })
return h.response(result)
} catch (err) {
return h.response(error).code(500)
}
}
Обновить:
Вы неправильно определяете модель мангуста. Схема это не просто объект. Это должен быть мангустовый объект. Что-то вроде этого
const schema = new Mongoose.Schema({
hash: String,
height: Number,
size: Number,
time: Number
})
export default Mongoose.model("blocks", schema)
Вы не добавили $set
в свой упрощенный код, добавив, что он должен работать. Отправить payload
как объект с обязательными полями.
server.route({
method: "PUT",
path:"/api/blockinfo/{hash}",
handler: async (request, h) => {
try{
var result = await BlockModel.findOneAndUpdate(request.params.hash, { $set: request.payload } , {new: true});
return h.response(result);
}catch{
return h.response(error).code(500);
}
}
})
Похожие вопросы
Новые вопросы
mongodb
MongoDB - это масштабируемая, высокопроизводительная база данных NoSQL с открытым исходным кодом, ориентированная на документы. Он поддерживает большое количество языков и платформ разработки приложений. Вопросы по администрированию сервера можно задать на https://dba.stackexchange.com.