0

私は最初の Node.js アプリケーションを開発しており (実際には、楽しみと練習のために古いコードを Node に移動しています)、Heroku でホストして遊んでいます。

foreman を使用してローカルでアプリケーションを正常に実行することができましたが、アプリケーションを Heroku にデプロイするたびに起動しますが、クエリの処理に失敗します。いくつかの調査を行ったところ、特定のものが見つかりませんでしたが、いくつかのモジュールが Heroku によって正しくインストールされていないように見えます

MySQL データベースは Amazon RDS でホストされており、手順、アクセス権、およびセキュリティ例外を既に実行して再確認しましたが、問題はないようです。

package.json で定義されている次のモジュールを使用しています。

{
 "name": "AppName",
 "version": "0.0.1",
 "dependencies": {
   "express": "2.5.x",
   "jade": "0.28.1",
   "stylus": "0.32.0",
   "mysql": "2.0.0-alpha7",
   "string": "1.2.*",
   "sanitizer": "0.0.*",
   "validator": "0.4.8"
 },
 "engines": {
 "node": "0.8.*",
 "npm": "1.*.*"
 }
}

アプリファイルの先頭で呼び出されます:

var express = require('express');
var crypto = require('crypto');
var S = require('string');
var mysql = require('mysql');
var sanitizer = require('sanitizer');
var check = require('validator').check,
sanitize = require('validator').sanitize;

エラーメッセージは次のとおりです。

TypeError: Cannot call method 'query' of undefined
at pool.getConnection.app.get.connection.query.res.render.global_title (/app/web.js:40:14)
at callbacks (/app/node_modules/express/lib/router/index.js:272:11)
at param (/app/node_modules/express/lib/router/index.js:246:11)
at pass (/app/node_modules/express/lib/router/index.js:253:5)
at Router._dispatch (/app/node_modules/express/lib/router/index.js:280:5)
at Object.middleware [as handle] (/app/node_modules/express/lib/router/index.js:45:10)
at next (/app/node_modules/express/node_modules/connect/lib/http.js:204:15)
at Object.stylus (/app/node_modules/stylus/lib/middleware.js:181:7)
at next (/app/node_modules/express/node_modules/connect/lib/http.js:204:15)
at Object.methodOverride [as handle]     (/app/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js:35:5)

そして、失敗しているコードのセグメント:

pool.getConnection(function(err, connection) {

app.get('/', function(req, res){

    connection.query('QUERY_HERE', function(err, rows, fields) {
      if (err) throw console.log(err);

      res.render('index', {
        global_title: S(site_title).stripTags().s,
        title: S(rows[0].title).stripTags().s,
        bodytext: sanitize(sanitizer.sanitize(rows[0].content)).xss()
      });

      connection.end();

    });
});
//end connection
});

これは、Heroku がブラウザーまたはログに表示する唯一のエラーであり、ビルドに問題はないようです。

私はここでちょっと途方に暮れているので、Heroku に連絡する前に、誰かが私がどこでバカなのかを正確に指摘して、転がしてくれることを願っています!

前もって感謝します。

アップデート:

Pascal Belloncle によって提案されたコード変更を使用してログにエラーをキャプチャすると、ブラウザーにアプリケーション エラーが表示され、ログに次のように表示されます。

 connection.query(QUERY, function(err, row
 at Handshake.Sequence.end (/app/node_modules/mysql/lib/protocol/sequences/Sequence.js:66:24)
 at Protocol.handleNetworkError (/app/node_modules/mysql/lib/protocol/Protocol.js:230:14)
 at Socket.EventEmitter.emit (events.js:126:20)
 at Socket._destroy.self.errorEmitted (net.js:328:14)
 TypeError: Cannot call method 'query' of undefined
 at process.startup.processNextTick.process._tickCallback (node.js:244:9)
 at Handshake.Pool.getConnection [as _callback] (/app/node_modules/mysql/lib/Pool.js:35:9)
 at Connection._handleNetworkError (/app/node_modules/mysql/lib/Connection.js:145:18)
 at /app/web.js:40:15

同じ時点でまだクラッシュしているようで、有用なエラーはありません。

更新 2:

エラーメッセージ!

2013-02-06T06:32:57+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response" method=GET path=/ host=trash-media.herokuapp.com fwd=31.3.253.10 dyno=web.1 queue=0ms wait=0ms connect=4ms service=21033ms status=503 bytes=0

https://devcenter.heroku.com/articles/error-codes#h13-connection-closed-without-response

更新 3:

更新 2 のエラー メッセージを確認し、RDS のセキュリティ設定をいじった結果、Heroku がホストされている場所 (us-west) と RDS DB が存在する場所 (eu) の間のアベイラビリティ ゾーンの違いに関連しているように見えます。 -西)。私はHerokuのサポートでそれを提起しました。答えが得られた場合はこの質問を閉じ、できれば実用的な解決策または回避策を示します。

4

2 に答える 2

1

1 行目の err の値を確認します。接続が定義されていない場合は、エラーが発生している可能性があります。

さらに、リクエストごとに新しい接続を取得してから、プールに戻る必要があります。

app.get('/', function(req, res){
  pool.getConnection(function(err, connection) {
    if (err) {
      console.error("getConnection", err);
    }
    // do stuff here
    connection.end(); // return connection to the pool
  });
});
于 2013-02-05T22:10:15.483 に答える
0

この問題は、Heroku アプリがある場所 (米国) と RDS がある場所 (EU) の間の AWS のアベイラビリティーゾーンの違いに関連しているように見えるため、この質問を終了します。

RDS 開発者ツールのウォークスルーで提案されているようにゾーンを変更しても、Heroku はまだ RDS と対話できません。

これを回避するには、RDS データベースのセキュリティ グループ ポリシーを変更して、すべての接続を許可します。

0.0.0.0/0

または、データベースを米国の可用性ゾーンに移動します。

ほとんど理想的ではありません。

Heroku サポートからの返信を 4 日間待っているので、他の提案があれば、この回答に追加します。

于 2013-02-10T14:27:27.020 に答える