将 mongodb bson.Objectid 从 JavaScript(前端)传递到 Go(后端)

pass the mongodb bson.Objectid from JavaScript(fronend) to Go(backend)

我想通过检查对象 ID 来更新 MongoDB 对象属性值。即类型是 bson.Objectid。我正在使用 mgo.v2 MongoDB Golang 驱动程序。 但在那种情况下,我将 PUT 请求发送到更新 API。 我将 object id HEX 值作为字符串发送到 Golang API。 但是在将 HEX 值解码为 bson.Object 类型变量时,我的 Golang 端发生了错误。
我该如何正确执行此操作。


前端:

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(&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-使用以下方法将十六进制值解码为 bson.ObjectId 类型:

bson.ObjectIdHex("57f54ef4d6e0ac55f6c7ff24")

2- 要通过检查对象 ID 更新 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(
        &Widget{bson.NewObjectId(), 1, 2, "c1"},
        &Widget{bson.NewObjectId(), 20, 2, "normal"},
        &Widget{bson.ObjectIdHex("57f54ef4d6e0ac55f6c7ff24"), 2, 2, "normal"})
    if err != nil {
        log.Fatal(err)
    }

    result := []Widget{}
    err = c.Find(bson.M{}).All(&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(&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(&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(&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- 您的代码有一些拼写错误:

log error : There is error happening decoding widget

此错误属于

err := decoder.Decode(&widget)

改成这样:

err := decoder.Decode(&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(&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(&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}