database - 如何在单独的函数中连接到 MongoDB?
问题描述
在这段代码中,我将 MongoDB 数据库与 golang 连接并在其中插入数据。我想将Connection()
功能与Insertdata()
功能分开(与我制作的其他功能,如Finddata()
,Deletedata()
等)。
但是当我尝试将它分开时,函数中的client
变量给了我一条消息,而来自的变量给了我一条消息。如何处理?Connection()
it is declared but not used
client
Insertdata()
it is undeclared
func Connection() {
// Set client options
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
// Connect to MongoDB
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
log.Fatal(err)
}
}
func Insertdata(inputData interface{}) {
Connection()
err, collection := client.Database("PMS").Collection("dataStored")
collection.InsertOne(context.TODO(), inputData)
if err != nil {
log.Fatal(err)
}
}
解决方案
在 Go 中,我们通常将依赖项存储在结构类型字段中。围绕数据库定义一些抽象,这些抽象将包含一个*mongo.Client
(或该类型满足的接口):
type DB struct {
client *mongo.Client
}
DB
在您的类型的工厂函数中实例化客户端一次:
func NewDB(ctx context.Context, uri string) (*DB, error) {
clientOptions := options.Client().ApplyURI(uri)
client, err := mongo.Connect(ctx, clientOptions)
if err != nil {
return nil, err
}
db := DB {
client: client,
}
return &db, nil
}
然后声明Insertdata
为方法(不是函数)*DB
。这样,您将能够通过其接收器在该方法中使用(和重用)客户端。
func (db *DB) Insertdata(ctx context.Context, inputData interface{}) error {
collection := db.client.Database("PMS").Collection("dataStored")
_, err := collection.InsertOne(ctx, inputData)
return err
}
还:
- 不要
context.TODO()
在生产代码中硬编码。添加一个context.Context
参数以使相关函数和方法可以从调用堆栈的更高层取消。 - 不要忽略错误。如果您无法在函数或方法中处理它们,请将它们返回给调用者。
推荐阅读
- authentication - 为 Solrcloud 8.8.2 配置 JWT 身份验证
- android - ionic ngx-dropzone 隐藏拍照IOS的选项
- date - Perl:从预先格式化的日期时间字符串中获取周数
- android - 构建发布后,Flutter 应用程序卡在白屏上
- javascript - 如何从 Firebase 存储下载 pdf
- django - 在基于 Django 的 GraphQL API 中为 postgres 表创建全局搜索字段的最佳方法?
- reactjs - vscode tsconfig 值保持重置为默认值
- javascript - 如何将数据存储在可从任何地方访问的 nextjs 中
- reactjs - 在 React 应用程序中使用标准类是不好的做法吗?
- azure-devops - 如何选择 google play 应用签名首选项以轻松将其集成到 Azure DevOps 发布管道中