将 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}
我想通过检查对象 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}