4

Google App EngineエンジンにカスタムNode.jsアプリケーションを正常にデプロイしました。しかし、接続しようとするとmongooseがタイムアウトするため、アプリを起動する際に問題が発生しています。誠実に、マングースは私のローカルマシンでまったく同じパラメータで接続します。Google App EngineにMongooseを接続する

私のMongoDBのURIの形式は次のとおりです。

mongodb://<dbuser>:<dbpassword>@xxxx.mlab.com:<portNumber>/d‌​b-name 

URIが示すように

は、DBはMLABによってホストされています。 Google Cloud Platformのサンドボックスインスタンスです。私はしかし、Google Compute Engineでdbを配備しませんでした。私は単にmlabのセットアッププロセスを進めるときにGCPをホストすることにしました。

私も同様の質問をしてきましたが、ほとんどの人には受け入れられた答えがありません。コメントの談話を受け入れる解決策なしで変えてください。

私の質問は、私のApp Engineインスタンスと上記のURIに接続しようとしたときのローカルコンピュータとの違いは何ですか?私がmlabをGCP問題でホストすることを選択したという事実はありますか? Amazon AWSでホストされることを選択した場合、それはまったく異なっていますか?問題の根本原因はなんですか?

参考のため、ここでの同様の質問は、私が見つけたです:

、それは場合に役立ちます、MongoDBのは、 db、ビジネスモデル用、アプリケーションのExpress Session用のデータストア、socket.ioからの一時データの格納用に使用します。展開後のApp Engineから

エラースタックトレース:Googleクラウドシェルでローカルにアプリケーションを実行しているから

2017-10-18 02:13:46 default[20171017t215757] npm ERR! enoent ENOENT: no such file or directory, open '/app/package.json' 
2017-10-18 02:13:46 default[20171017t215757] npm ERR! enoent ENOENT: no such file or directory, open '/app/package.json' 
2017-10-18 02:13:46 default[20171017t215757] npm ERR! enoent This is most likely not a problem with npm itself 
2017-10-18 02:13:46 default[20171017t215757] npm ERR! enoent and is related to npm not being able to find a file. 
2017-10-18 02:13:46 default[20171017t215757] npm ERR! enoent 
2017-10-18 02:13:46 default[20171017t215757] 
2017-10-18 02:13:46 default[20171017t215757] npm ERR! Please include the following file with any support request: 
2017-10-18 02:13:46 default[20171017t215757] npm ERR!  /app/npm-debug.log 
2017-10-18 02:23:41 default[20171017t215757] npm ERR! Linux 3.16.0-4-amd64 
2017-10-18 02:23:41 default[20171017t215757] npm ERR! argv "/nodejs/bin/node" "/nodejs/bin/npm" "start" 
2017-10-18 02:23:41 default[20171017t215757] npm ERR! node v6.11.3 
2017-10-18 02:23:41 default[20171017t215757] npm ERR! npm v3.10.10 
2017-10-18 02:23:41 default[20171017t215757] npm ERR! path /app/package.json 
2017-10-18 02:23:41 default[20171017t215757] npm ERR! code ENOENT 
2017-10-18 02:23:41 default[20171017t215757] npm ERR! errno -2 
2017-10-18 02:23:41 default[20171017t215757] npm ERR! syscall open 

エラースタックトレース:それは指摘されていますと、あなたはhttps://cloud.google.com/nodejs/getting-started/deploy-mongodb上の指示に従うことができ

/home/myuser/src/project-id/teammate-express-server/node_modules/mongodb/lib/mongo_client.js:421 
      throw err 
     ^
MongoError: failed to connect to server [ds147454.mlab.com:47454] on first connect [MongoError: connection 1 to ds147454.mlab.com:47454 timed out] 
    at Pool.<anonymous> (/home/myuser/src/project-id/teammate-express-server/node_modules/mongodb-core/lib/topologies/server.js:336:35) 
    at emitOne (events.js:96:13) 
    at Pool.emit (events.js:188:7) 
    at Connection.<anonymous> (/home/myuser/src/project-id/teammate-express-server/node_modules/mongodb-core/lib/connection/pool.js:280:12) 
    at Connection.g (events.js:292:16) 
    at emitTwo (events.js:106:13) 
    at Connection.emit (events.js:191:7) 
    at Socket.<anonymous> (/home/myuser/src/project-id/teammate-express-server/node_modules/mongodb-core/lib/connection/connection.js:197:10) 
    at Socket.g (events.js:292:16) 
    at emitNone (events.js:86:13) 
    at Socket.emit (events.js:185:7) 
    at Socket._onTimeout (net.js:338:8) 
    at ontimeout (timers.js:386:14) 
    at tryOnTimeout (timers.js:250:5) 
    at Timer.listOnTimeout (timers.js:214:5) 
+0

実際にGCPでホストされていますか?つまり、Google Cloud Platformコンソールにログインし、GCEインスタンスを確認し、そのためにプロビジョニングされたVMサーバを見つけることができますか?その場合、どのファイアウォールルールが関連付けられていますか? – BrettJ

+1

https://cloud.google.com/nodejs/getting-started/deploy-mongodbのドキュメントに従っていますか? – BrettJ

答えて

2

これは私にとっては長すぎますが、問題は私のDockerfileにありました。

私はnode.jsランタイムを拡張していましたが、Dockerfileにはアプリケーションディレクトリをコピーしてnpmをインストールする行がありませんでした。

は、適切なDockerfileを作成するために、私は、次のコマンドを使用します。コマンドについて

gcloud beta app gen-config --custom 

さらに詳しい情報やNode.jsのランタイムを拡張するhereを見つけることができます。私は依存関係を追加した後、私の最後のDockerfileは私が必要

は次のようになります。

注:私は、展開後の私のMongoDBインスタンスに接続することができます。クラウドシェルでローカルに実行するとタイムアウトになります。

# Dockerfile extending the generic Node image with application files for a 
# single application. 
FROM gcr.io/google_appengine/nodejs 
COPY . /app/ 

RUN apt-get -y update && apt-get install -y libav-tools && apt-get install -y graphicsmagick 

# You have to specify "--unsafe-perm" with npm install 
# when running as root. Failing to do this can cause 
# install to appear to succeed even if a preinstall 
# script fails, and may have other adverse consequences 
# as well. 
# This command will also cat the npm-debug.log file after the 
# build, if it exists. 
RUN npm install --unsafe-perm || \ 
    ((if [ -f npm-debug.log ]; then \ 
     cat npm-debug.log; \ 
    fi) && false) 
CMD npm start 
+0

Google App EngineでMongooseを実行しましたか? [こちらのドキュメント](https://cloud.google.com/appengine/docs/flexible/nodejs/using-third-party-databases)を見ると、Google Compute Engine、GCEが必要とされているようです。どう思いますか? –

+0

@RonRoyston私は、それは本当にうまく動作します。 App Engineはウェブソケットをサポートしていないため、Compute Engineを使用する必要があります。 –

3

config.jsonファイルを使用してGoogle App Engineを設定してください。

mongooseを使用しているため、モデルによってコレクションの使用が決まります。つまりsave()、update()です。 node.jsを使って直接接続している場合は、コード内で簡単にデータベース/コレクションを変更することもできます。

上記のURIに接続しようとすると、私のApp Engineインスタンスとローカルコンピュータの違いは何ですか?

Google App Engineは完全に管理されたプラットフォームです。それは意味ではserverless、あなたのアプリケーションを拡大/縮小するために労働者のプールを利用しています。アプリケーションにリクエストが送られると、プールのインスタンスがタスク/リクエストを処理します。

あなたのローカルマシンとは異なり、リクエストはあなたのマシンでも処理されます。

Google App Engine FAQも便利です。

私がmlabをGCP問題でホストすることを選択したという事実はありますか?

あまりありません。あなたが言及したように、あなたは現在、GCPのSandBox(無料)プランに入っています。現時点では、これはあなたのMongoDBインスタンスをus-central1地域に配備するでしょう、そして、地域の他の選択肢はありません。また、異なるクラウドプロバイダ間でRAM /ストレージ/価格のわずかな変動もあります。

us-central1地域のGAEを選択すると、ネットワークの待ち時間を短縮できます。

問題の根本原因はなんですか?

タイムアウトの問題を説明する適切なスタックトレースまたはエラーログがないと、何が問題であるかを知ることは難しいです。

  • コマンドライン引数
  • 環境:基本的に順に設定を読み取ろうと

    nconf.argv() 
         .env() 
         .file({ file: path.join(__dirname, 'config.json') }) 
         .defaults() 
    

    は、一般的にnode.jsプロジェクトは、以下の行を持っているconfig.jsと呼ばれるJavaScriptファイルが含まれています変数

  • 設定ファイル(指定されたパス)
  • デフォルト

は、例えばもまたGoogle Cloud Platform: nodejs-getting-started

GoogleCloudPlatform/nodejs-docs-samples/appengine/mongodbプロジェクトを参照してください値。

+0

こんにちはWan、非常に詳細な応答に感謝します。 App Engineがconfig.jsファイルとnconfに内部的に依存しているかどうか知りませんか?私は、nconfを使わずに自分の環境変数を読むために使うconfig.jsonファイルを持っています。 App Engineは、それらについて知らない場合、urisへの接続をブロックしますか?私はチュートリアルを何度も何度も読んできましたが、私は何もしていないようです。私はmongoクライアントを使って簡単なhelloworldノードサーバーを実行しようとしていましたが、それでもタイムアウトしました。 –

+1

こんにちは、社内ではありません。これはnode.jsコード内にあるはずです。たとえば、[server.js:L25](https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/master/appengine/mongodb/server.js#L25)のnode.jsサンプルファイルを参照してください。別のJSONファイル設定のまだGAEからの接続に問題がある場合は、コードとエラースタックトレースを投稿してください。 –

+0

ログが追加されました、ありがとうございます。 –

関連する問題