В настоящее время у меня есть следующая функция Мангуста в вызове 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
});
2
mouchin777 2 Май 2019 в 10:56

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.

0
mouchin777 2 Май 2019 в 11:40

Проблема в вашем ключе 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)
1
Ashh 2 Май 2019 в 10:09

Вы не добавили $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);
        }
    }
})
0
Amol B Jamkar 6 Май 2019 в 10:10