[トップ]Golang+Mongodbを使ってあなたの最初の駅を作ります.


多くの人がMEANを紹介してサイトを開発します.MEANはM:mongodb、E:express、A:anglarの最後のN:nodejsです.しかし、jsのネスト・リプを身をもって感じたら、他の方法に変えたいと思います.プロミセなどの枠组みで深い入れ子を解くことができるとはいえ、やはり言叶自体がサポートしているわけではない.
なぜGolangを使うと言いますか?Golangはダイナミックな言語の特徴がある静的な言語だからです.文法は簡単で、文法飴はなるべく文法を減らします.コンパイルするときには誤りをたくさん排除することができます.動態言語のように運行する時にピットに落ちなくてもいいです.
Golangの多くのWebフレームの中からMartiniが発見された.彼は後でこのフレームが多すぎる反射で効率に影響を与えたと思います.別のフレームを書いたり、作者の話によると「中間件」があります.Negroniといいます.具体的な開発原因はここを見ます.この作者はお酒が好きなのかもしれません.彼の書いた枠組みを飲み物の名前で呼んでいます.Marginという枠組みは、著者がExpresjsの啓発を受けて書いたものです.したがって、多くの使用上のものは非常に似ています.例えば、routeの結合文法や、中間部品の結合文法などをサポートしています.Golangの他のフレームも見たことがあります.例えばRevelは、多くのクールな機能とワンストップの多くのサポートがありますが、Martiniは柔軟にMarginを選択することを決めました.
データベースMongoDB
データベースについては、物事とデータの整合性に対する要求がそんなに強くないなら、比較的簡単なNoSQLデータベースを選んだほうがいいです.だから、MongoDBを使いました.厳格な仕事の中でこのように使うべきではないかもしれません.しかし、MongoDBはHttp POSTから来たjsonデータを直接データベースに書き込むだけで簡単にできます.Jsonが簡単だったら、設計は全然しなくてもいいです.もちろん、実際に働いている時はこのようなことができません.私たちが議論しているのはこのような実現可能性だけです.
じゃ、マーティンとモンブランでウェブアプリを作ります.このアプリの名前はナビゲートといいます.これらの問題の文脈情報は非常に限られています.したがって、ユーザーが携帯電話のクライアントを通じてnavigatorのインターフェースを呼び出して、関連するコンテキスト情報を同時に提出します.Golangに関する基本的なものはここでは検討しません.go getはMartiniを取得し、MongoDBをダウンロードします.その後は命令runを使ってMongoDBに来ます.DBに名前を付けます.NDB.そして中にdocumentを詰めます.MongoDBはinsert一つDcumentがないと、このデータベースは作成されていません.このDocmentはJsonです.フォーマットは:

  
  
  
  
{ "feedbackcode" : "123" , "username" : "" , "phonenum" : "" , "deviceinfo" : { "systemtype" : "" , "systemver" : "" , "appver" : "" } , "imagelist" : [ ] , "desc" : "testing" , "feedbacktype" : "" , "other" : "" }

feedbackCodeは のfeedbackを しています.データベースの は に されました.
サイトのディレクトリ
たちのサイト を します.まずディレクトリ を べてみます.


  
  
  
  
navigator |———conf |-————–Conf.go # |—————–ConfigError.go # |———controllers |—————–FeedbackController.go |—————–IndexController.go |–––models |––––––FeedbackModel.go server.go

REST API MVC 。 View, Html 。 , Model Controller。view , render json。

RUN

, web app 。 server.go :


  
  
  
  
package main import "github.com/go-martini/martini" func main ( ) { m := martini . Classic ( ) m . Get ( "/" , func ( ) string { return "Hello world!" } ) m . Run ( ) }

go run server.goコマンドでこのウェブアプリを させることができます.デフォルトでは3000ポートで します.ページ でもハゲの しか えません.ハローワールド!  martini.Classic()が び した 、マーティンはデフォルトでいくつかのツールを します. なのはルートです.その 、m.Get("/", func()string{return "Hello, world!"}を してどの がどの にマッピングされるかを してもいいです. にm.Run() を び して3000ポートで のアプリを します.
からこのアプリを に します.まず な が です. たちは をするべきですか? に べたように、ユーザーはこのAPIでfeedbackを して、 のインターフェースでこれらの をリスト で します. はこんなに です. のステップでこれらの を します.
Controller
insert 1つのfeedbackのために な はまだ きいです. なfeedbackデータをPOSTで ります.ですから、POSTのパスと Handlerが です.


  
  
  
  
m . Post ( "/" , func ( req * http . Request ) string { // req , } )

feedback GET 。 GET Handler。 :


  
  
  
  
m . Get ( "/" , func ( ) string { // Json return [ ] map [ string ] string { map [ string ] string { "feedbackcode" : "1" , "username" : "John" } , map [ string ] string { "feedbackcode" : "2" , "username" : "Tony" } } }

Handler API 。 Controller。

Controller

, :


  
  
  
  
package controllers import ( // "fmt" "fmt" "github.com/martini-contrib/render" "navigator/conf" "navigator/models" "net/http" ) type FeedbackController struct { } func ( c * FeedbackController ) FeedbackList ( req * http . Request , r render . Render ) { f := new ( models . FeedbackModel ) r . JSON ( 200 , map [ string ] interface { } { "data" : f . ModelList ( nil ) } ) }

github.com/martini-contrib/render、 レンダーはレンダリングされたカバンです.htmlの があれば、データをhtmlテンプレートで できるデータに できます.ここではこのカバンを って をjsonデータに します.  r.JSON(200, map[string]interface{}{"data": f.ModelList(nil)})の で200は コードです. が な はstringがkeyで、Modelリストが の です.
ここでは に のfeedbackのModel を ることができます.


  
  
  
  
type DeviceInfo struct { SystemType string ` json : "systemType" ` // ios or android SystemVer string ` json : "systemVersion" ` // system version eg, ios 9.1 AppVer string ` json : "appVersion" ` // app version eg, 2.9.0 } type FeedbackModel struct { FeedbackCode string ` json : "feedbackCode" ` UserName string ` json : "userName" ` PhoneNum string ` json : "phoneNum" ` DeviceInfo DeviceInfo ` json : "deviceInfo" ` ImageList [ ] string ` json : "imageList" ` Desc string ` json : "description" ` FeedbackType string ` json : "feedbackType" ` // normal feedback or a problem in use Other string ` json : "other" ` // other infomation }

json , Golang Model 。 "``" , Model json Model json key 。 Controller , Controller Get Post Handler 。 :


  
  
  
  
package main import ( // other packages "navigator/controllers" ) func main ( ) { var m = martini . Classic ( ) var r = martini . NewRouter ( ) feedbackController := new ( controllers . FeedbackController ) r . Get ( "/nav/feedback" , feedbackController . FeedbackList ) r . Post ( "/nav/feedback" , feedbackController . Feedback ) m . Action ( r . Handle ) m . RunOnAddr ( ":9090" ) }

r.Get("/nav/feedback", feedbackController.FeedbackList)は、 のアクセス を しました./nav/feedbackは、パスにプロジェクトの を けて したものです. feedbackというのは、 の インターフェースと する があります.つまりインターフェースの です.この を けるためにプロジェクト を けました.feedbackController := new(controllers.FeedbackController)はFeedbackControllerを しました.feedbackControllerは、Feedback Controllerを しました.244579142の です.FeedbackListは、アクセスの と される. GETのHttpアクセスとFeedbackList は されています.POSTのHttpアクセスとFeedback はバインディングされています. にm.RunOnAddr(":9090")は に したm.Run()の わりになりました. はappは3000ポートで していました. はm.RunOnAddr(":9090")を じて9090ポートで されます.つまり、このフレーズでappの ポートを することができます.
ModelsとMongoDB
MongoDBを っています. たちはmgoというライブラリを っています.Golangはもう になりました.これだけ くのスター が ています.しかし、MongoDBを う したライブラリはまだないと ってもいいです.pythonやnodejsなどの のライブラリがそんなに だとは いません. なものがあります. のギthub の がたくさんあります.Golangでもあります.Golangでもあります.Golangの にはgomgoライブラリということです. できます
POSTが したfeedbackのjson が られてきたら、FeedbackModelのオブジェクトに されます.Golangのjsonライブラリはこのようにしてくれます.  json.Unmarshal([]byte(dict), &f)ここのUnmarshal では、 つのjson をFeedbackModelオブジェクトに します.ここでは、 つの を します. つのModelオブジェクトを し、このオブジェクトは つの Modelオブジェクトであるべきです. のこのModelオブジェクトは、オペレーティングデータベース、 、 、 、 が な を えています.


  
  
  
  
func NewFeedbackModel ( dict string ) * FeedbackModel { var f FeedbackModel err := json . Unmarshal ( [ ] byte ( dict ) , & f ) if err != nil { return nil } return & f }

"encoding/json".feedbackのjson を け ると、この でFeedbackModelオブジェクトに します. で べたように、このModelにデータベース を する があります.json で られたModelでデータの ができます.コード:


  
  
  
  
func ( m * FeedbackModel ) ModelList ( conditions map [ string ] string ) [ ] FeedbackModel { confInstance := conf . ConfigInstance ( ) mgoUri := conf . ConfigInstance ( ) . MongoDBConnectionString ( ) // var f FeedbackModel session , err := mgo . Dial ( mgoUri ) if err != nil { fmt . Printf ( "can not connect to server %v
" , err ) panic ( err ) } defer session . Close ( ) var feedbackModelList [ ] FeedbackModel collection := session . DB ( confInstance . DBName ) . C ( "feedback" ) err = collection . Find ( conditions ) . All ( & feedbackModelList ) return feedbackModelList } func ( m * FeedbackModel ) GetModel ( modelId string ) ( * FeedbackModel , error ) { // collection := session . DB ( confInstance . DBName ) . C ( "feedback" ) err = collection . Find ( bson . M { "feedbackcode" : modelId } ) . One ( & f ) return & f , nil } func ( m * FeedbackModel ) InsertModel ( model * FeedbackModel ) error { // f := session . DB ( confInstance . DBName ) . C ( "feedback" ) err = f . Insert ( model ) return err }
.
ここまで れば、 のfeedbackを から までの を げることができます.
します
のアプリの り にあります. されたパスと なController が されています. が たら、パスとバインディングのパスが しています.Controllerに られるバインディングされた の で されます.
このhttp を するController はhttp を したjson をModelモジュールに します.Modelモジュールはjson をModelインスタンスに します.このModelは なModelです.その を び してModel のデータをMongoデータベースに します.もちろん、データベースからこれらのデータを べられます.
ここに てください
ここに て、MartiniというGolangフレームで なサイトを する に れました.はい、 はRESTアプリです. の で べたRenderフレームを って、Modelデータを してから、htmlのtemplateに することができます.MongoDBデータベースにも れています.とても なデータベースです.RESTアプリを しますか?それともhtmlサイトを しますか? なものはすべてMongoDBデータベースの に できます.ここに けば、 の の を に けられます.

MongoDB 。 MongoDB , , , Collection。 。 , 。 , Document。 Document 2M。

MongoDB :


  
  
  
  
db . feedback . find ( { "feedbackCode" : "1" } ) // {"feedbackCode":"1"}) //

find , 。 :


  
  
  
  
db . feedback . insert ( { "feedbackCode" : "2" } )

Golang mgo MongoDB , Go 。


  
  
  
  
collection := session . DB ( confInstance . DBName ) . C ( "feedback" )

Collection。 、 、 Collection 。 , :


  
  
  
  
collection . Find ( conditions ) . All ( & feedbackModelList )

feedback Model 。 :


  
  
  
  
collection . Find ( bson . M { "feedbackcode" : modelId } ) . One ( & f )


  
  
  
  
collection . Insert ( model )

insert , model , :var model *FeedbackModel