передайте mongodb bson.Objectid из JavaScript (интерфейс) в Go (серверную часть)

#javascript #mongodb #go #bson #database

#javascript #mongodb #Вперед #bson #База данных

Вопрос:

Я хочу обновить значение атрибута объекта MongoDB, проверив идентификатор объекта. то есть тип — bson .Objectid. Я использую mgo.v2 драйвер MongoDB Golang. Но в этом случае я отправляю PUT запрос в API обновления. Я отправляю object id шестнадцатеричное значение в виде строки в API Golang. Но на моей стороне Golang возникает ошибка при декодировании шестнадцатеричного значения в bson.Object переменную типа.
Как мне сделать это правильно.


Интерфейс :

 HEXVALUE = "57f54ef4d6e0ac55f6c7ff24"

var widget = {id: HEXVALUE, position: 2, type: 2, class: "normal"};

     $.ajax({
            url: 'api/widget',
            type: 'PUT',
            contentType: "application/json",
            data: JSON.stringify(widget),
            success: function (data) {
                console.log(data);
            },
            error: function (e) {
                console.log(e);
            }
     });
  

На стороне перехода (на стороне сервера):

 type Widget struct {
    Id       bson.ObjectId `json:"id" bson:"_id"`
    Position int           `json:"position" bson:"position"`
    Type     int           `json:"type" bson:"type"`
    Class    string        `json:"class" bson:"class"`
}


func UpdateWidget(w http.ResponseWriter, r *http.Request) (error) {
    decoder := json.NewDecoder(r.Body)
    var widget models.DashboardWidget
    err := decoder.Decode(amp;widget)
    if err != nil {
        log.Error("There is error happening decoding widget: %v", err);
        return err;
    }
 reurn nil
};
  

Вывод

 log error : There is error happening decoding widget
  

Как декодировать шестнадцатеричное значение в bson.ObjectId тип.

Комментарии:

1. Можете ли вы также зарегистрировать ошибку? log.Errorf("There is error happening decoding widget: %v", err);

2. Все в порядке .. но мой вопрос в другом

Ответ №1:

1-Декодировать шестнадцатеричное значение в bson.ObjectId тип, используя:

 bson.ObjectIdHex("57f54ef4d6e0ac55f6c7ff24")
  

2- Чтобы обновить значение атрибута объекта MongoDB путем проверки идентификатора объекта, вы можете использовать

 c.Update(bson.M{"_id": widget.Id}, widget)
  

Вот рабочий код:

 package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "strings"

    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)

func main() {
    session, err := mgo.Dial("localhost")
    if err != nil {
        panic(err)
    }
    defer session.Close()
    session.SetMode(mgo.Monotonic, true) // Optional. Switch the session to a monotonic behavior.
    c := session.DB("test").C("Widget")
    c.DropCollection()
    err = c.Insert(
        amp;Widget{bson.NewObjectId(), 1, 2, "c1"},
        amp;Widget{bson.NewObjectId(), 20, 2, "normal"},
        amp;Widget{bson.ObjectIdHex("57f54ef4d6e0ac55f6c7ff24"), 2, 2, "normal"})
    if err != nil {
        log.Fatal(err)
    }

    result := []Widget{}
    err = c.Find(bson.M{}).All(amp;result)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(result)

    s := `{"id":"57f54ef4d6e0ac55f6c7ff24","position":2,"type":2,"class":"normal"}`
    decoder := json.NewDecoder(strings.NewReader(s))
    var widget Widget
    err = decoder.Decode(amp;widget)
    if err != nil {
        panic(err)
    }
    fmt.Println(widget)

    c.Update(bson.M{"_id": widget.Id}, widget)

    result2 := []Widget{}
    err = c.Find(bson.M{}).All(amp;result2)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(result2)

    //http.HandleFunc("/", UpdateWidget)
    //http.ListenAndServe(":80", nil)

}
func UpdateWidget(w http.ResponseWriter, r *http.Request) {
    decoder := json.NewDecoder(r.Body)
    var widget Widget //models.DashboardWidget
    err := decoder.Decode(amp;widget)
    if err != nil {
        log.Fatal(err)
    }
}

type Widget struct {
    Id       bson.ObjectId `json:"id" bson:"_id"`
    Position int           `json:"position" bson:"position"`
    Type     int           `json:"type" bson:"type"`
    Class    string        `json:"class" bson:"class"`
}
  

вывод:

 [{ObjectIdHex("57f62973c3176903402adb5e") 1 2 c1} {ObjectIdHex("57f62973c3176903402adb5f") 20 2 normal} {ObjectIdHex("57f54ef4d6e0ac55f6c7ff24") 2 2 normal}]
{ObjectIdHex("57f54ef4d6e0ac55f6c7ff24") 2 2 normal}
[{ObjectIdHex("57f62973c3176903402adb5e") 1 2 c1} {ObjectIdHex("57f62973c3176903402adb5f") 20 2 normal} {ObjectIdHex("57f54ef4d6e0ac55f6c7ff24") 2 2 normal}]
  

3- В вашем коде есть некоторые опечатки:

ошибка журнала: происходит ошибка при декодировании виджета

Эта ошибка относится к

 err := decoder.Decode(amp;widget)
  

Измените его на это:

 err := decoder.Decode(amp;widget)
if err != nil {
    log.Fatal(err)
}
  

чтобы увидеть точную ошибку.


Изменить

 var widget models.DashboardWidget
  

Для

 var widget Widget
  

Вот так:

 func UpdateWidget(w http.ResponseWriter, r *http.Request) {
    decoder := json.NewDecoder(r.Body)
    var widget Widget //models.DashboardWidget
    err := decoder.Decode(amp;widget)
    if err != nil {
        log.Fatal(err)
    }
}
  

и

 JSON.stringify(widget)
  

генерирует:

 `{"id":"57f54ef4d6e0ac55f6c7ff24","position":2,"type":2,"class":"normal"}`
  

Это работает нормально:

 package main

import (
    "encoding/json"
    "fmt"
    "strings"

    "gopkg.in/mgo.v2/bson"
)

func main() {
    s := `{"id":"57f54ef4d6e0ac55f6c7ff24","position":2,"type":2,"class":"normal"}`
    decoder := json.NewDecoder(strings.NewReader(s))
    var widget Widget
    err := decoder.Decode(amp;widget)
    if err != nil {
        panic(err)
    }
    fmt.Println(widget)
}

type Widget struct {
    Id       bson.ObjectId `json:"id" bson:"_id"`
    Position int           `json:"position" bson:"position"`
    Type     int           `json:"type" bson:"type"`
    Class    string        `json:"class" bson:"class"`
}
  

вывод:

 {ObjectIdHex("57f54ef4d6e0ac55f6c7ff24") 2 2 normal}
  

Комментарии:

1. @sandunpriyanka : Надеюсь, это поможет.