将mongodb bson.Objectid从JavaScript(fronend)传递给Go(后端)

时间:2016-10-06 05:53:55

标签: javascript mongodb go bson database

我想通过检查对象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 个答案:

答案 0 :(得分:0)

使用以下方法将十六进制值解码为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-您的代码有一些拼写错误:

  

日志错误:解码小部件发生错误

此错误属于

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}