Golang初学者无法解决的问题

Golang beginner not able solve the problem

我想通过这种方法进行用户登录。这必须分为三个部分。与用户注册相同,但我不明白该怎么做?你能写下我如何以同样的方式编写用户登录逻辑吗?它是使用大猩猩 mux 创建的。

一种方法必须在 db_service.go 中,然后一种方法必须在 login_service.go 中 一种方法必须在 login.go.

这是db_service.go代码:

  /* Used to create a singleton object of MongoDB client.
Initialized and exposed through  GetMongoClient().*/

var clientInstance *mongo.Client

//Used during creation of singleton client object in GetMongoClient().
var clientInstanceError error

//Used to execute client creation procedure only once.
var mongoOnce sync.Once

//I have used below constants just to hold required database config's.
const (
    CONNECTIONSTRING = "http://127.0.0.1:27017"
    AUTH_DB          = "Cluster0"
    USER_COLLECTION  = "user"
)

//GetMongoClient - Return mongodb connection to work with
func GetMongoClient() (*mongo.Client, error) {

    //Perform connection creation operation only once.
    mongoOnce.Do(func() {
        // Set client options
        clientOptions := options.Client().ApplyURI(CONNECTIONSTRING)
        // Connect to MongoDB
        client, err := mongo.Connect(context.TODO(), clientOptions)
        if err != nil {
            clientInstanceError = err
        }
        // Check the connection
        err = client.Ping(context.TODO(), nil)
        if err != nil {
            clientInstanceError = err
        }
        log.Println("Connected Mongodb!")
        clientInstance = client
    })

    return clientInstance, clientInstanceError
}

//CreateIssue - Insert a new document in the collection.
func User_Collection(user *model.User) (*mongo.InsertOneResult, error) {

    //Create a handle to the respective collection in the database.
    collection := clientInstance.Database(AUTH_DB).Collection(USER_COLLECTION)

    //Perform InsertOne operation & validate against the error.
    return collection.InsertOne(context.TODO(), user)
}

login_service.go 包含用户注册代码:

 func Register_User(user *model.User) (interface{}, error) {

    user.CreatedAt = time.Now().UTC()
    user.UpdatedAt = time.Now().UTC()
    if result, err := util.User_Collection(user); err == nil {
        return result.InsertedID, err
    } else {
        return nil, err
    }
}

用户注册码:

func Register(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")

var user model.User
if err := json.NewDecoder(r.Body).Decode(&user); err == nil {

    if _, err := service.Register_User(&user); err == nil {
        w.WriteHeader(http.StatusCreated)
        json.NewEncoder(w).Encode(user)
    } else {
        w.WriteHeader(http.StatusInternalServerError)
        json.NewEncoder(w).Encode(err)
    }

} else {
    http.Error(w, err.Error(), http.StatusBadRequest)
    return
}

}

像这样的处理程序

func Login(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")

    var user model.User
    if err := json.NewDecoder(r.Body).Decode(&user); err == nil {

      if _, err := service.Login_User(&user); err == nil {
          json.NewEncoder(w).Encode(user)
      } else {
          w.WriteHeader(http.StatusInternalServerError)
          json.NewEncoder(w).Encode(err)
      }

    } else {
          http.Error(w, err.Error(), http.StatusBadRequest)
          return
    }
}

还有类似这样的数据库(需要实现查询而不是插入)

 func Login_User(user *model.User) (interface{}, error) {

    // Implement this query
    if result, err := util.Find_User(user); err == nil {
        return result, err
    } else {
        return nil, err
    }
}