gpt4 book ai didi

mongodb - 从处理程序中插入MongoDB文档

转载 作者:行者123 更新时间:2023-12-01 20:24:15 24 4
gpt4 key购买 nike

我有代码,当我尝试使用此调用控制台时,请编写undefined: insertContractData。我尝试更改此代码,但是Invalid memory address or nil pointer dereference出现错误,我无法理解如何正确执行操作。

我想我不正确的写结构
我不能再编译两天,但我不这样做。

我使用官方的Mongo-go驱动程序来连接该语言,因此我无法作为官方文档更精确地连接到Plaza本身。如果都是我的,那就证明是可以连接的。而且,单独地连接每个集合都无效,此代码通常应该以某种方式开始起作用,但是该工作不会发生,或者它工作不正确,在结构上发誓,所以在一种方法下发誓不知道这是解决方法,我不知道,但是我希望对此问题有一些解决方案。在此感谢您的帮助。

package main

import (
"context"
"encoding/json"
"log"
"net/http"
"time"

"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)

type Data struct {
Number string `json:"number"`
Driver string `json:"driver"`
Auto string `json:"auto"`
Tariff string `json:"tariff"`
Begindate string `json:"begindate"`
Enddate string `json:"enddate"`
Continues bool `json:"continues"`
MoreInfo string `json:"moreInfo"`
Status string `json:"status"`
}

type MyClient struct {
mc *mongo.Client
db *mongo.Database
}

func setupResponse(w http.ResponseWriter, req *http.Request) {
(w).Header().Set("Access-Control-Allow-Origin", "*")
(w).Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
(w).Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
}

func NewMyClient(url, db string) (mc *MyClient, err error) {
defer func() {
if err != nil {
mc = nil
}
}()
mc = &MyClient{}
if mc.mc, err = mongo.NewClient(options.Client().ApplyURI(url)); err != nil {
return
}
ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
err = mc.mc.Connect(ctx)
if err != nil {
log.Fatal(err)
}
defer mc.mc.Disconnect(ctx)
mc.db = mc.mc.Database(db)
return
}

func (mc *MyClient) insertContractData(w http.ResponseWriter, r *http.Request) {
setupResponse(w, r)
var err error
var data Data
err = json.NewDecoder(r.Body).Decode(&data)
if err != nil {
return
}

podcastsCollection := mc.db.Collection("test")
ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
defer mc.mc.Disconnect(ctx)
_, err = podcastsCollection.InsertOne(ctx, bson.D{
{"number", data.Number},
{"driver", data.Driver},
{"auto", data.Auto},
{"tariff", data.Tariff},
{"begindate", data.Begindate},
{"enddate", data.Enddate},
{"continues", data.Continues},
{"moreInfo", data.MoreInfo},
{"status", data.Status},
})
if err != nil {
log.Fatal(err)
}
}

func main() {
var mc MyClient
http.HandleFunc("/insertContractData", insertContractData)
//http.HandleFunc("/selectContractData", selectContractData)
http.ListenAndServe(":8081", nil)
}

最佳答案

您的示例有很多问题。

首先, context.WithTimeout() 返回您希望调用的 context.Context cancel函数,最好返回defer以确保释放分配的资源。

接下来,NewMyClient()负责连接到MongoDB服务器,但是在您的代码中您永远不会调用它。您应该在main()中调用它。

展望 future ,在main()中,insertContractData标识符未定义。您很可能希望将mc.insertContractData方法注册为处理程序(这是method value btw)。

您永远不要关闭MongoDB连接,当然也不要在处理程序的末尾,也不要在NewMyClient()函数中关闭。 defer mc.mc.Disconnect(ctx)行不仅是不需要的,而且会使您的应用程序无法运行。 mongo.Client 被设计为长寿的。它具有一个内部连接池,应该只创建一次,并从多个goroutine中重新使用它。它仅应在应用关闭时关闭。

因此,您的main()函数应如下所示:

func main() {
mc, err := NewMyClient("mongodb://localhost:27017", "someDB")
if err != nil {
panic(err)
}
http.HandleFunc("/insertContractData", mc.insertContractData)
panic(http.ListenAndServe(":8081", nil))
}
NewMyClient()可能看起来像这样:
func NewMyClient(url, db string) (mc *MyClient, err error) {
mc = &MyClient{}
if mc.mc, err = mongo.NewClient(options.Client().ApplyURI(url)); err != nil {
return
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
err = mc.mc.Connect(ctx)
if err != nil {
log.Fatal(err)
}
mc.db = mc.mc.Database(db)
return
}

和处理程序:
func (mc *MyClient) insertContractData(w http.ResponseWriter, r *http.Request) {
setupResponse(w, r)
var err error
var data Data
err = json.NewDecoder(r.Body).Decode(&data)
if err != nil {
fmt.Println(err)
return
}

podcastsCollection := mc.db.Collection("test")
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
_, err = podcastsCollection.InsertOne(ctx, bson.D{
{"number", data.Number},
{"driver", data.Driver},
{"auto", data.Auto},
{"tariff", data.Tariff},
{"begindate", data.Begindate},
{"enddate", data.Enddate},
{"continues", data.Continues},
{"moreInfo", data.MoreInfo},
{"status", data.Status},
})
if err != nil {
log.Fatal(err)
}
}

现在我们可以运行这个程序了。

我们可以使用以下 curl命令对其进行测试:
curl -d '{"number":"11","driver":"dr1","status":"s1"}' -X POST http://localhost:8081/insertContractData

如果我们连接到MongoDB数据库,并执行 db.test.find(),我们将看到以下文档:
{ "_id" : ObjectId("5e123e6c1618bd4c80a2e13f"), "number" : "11", "driver" : "dr1", "auto" : "", "tariff" : "", "begindate" : "", "enddate" : "", "continues" : false, "moreInfo" : "", "status" : "s1" }

关于mongodb - 从处理程序中插入MongoDB文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59603268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com