Heroku Node.js应用程序无法启动

时间:2013-02-05 21:18:55

标签: mysql node.js heroku express amazon-rds

我一直在开发我的第一个Node.js应用程序(实际上,将一些旧代码移动到Node以获得乐趣和练习)并且正在玩它在Heroku上托管它。

我已经能够获得应用程序,因为它使用工头在本地游泳运行,但每当我将应用程序部署到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之间的可用区域的差异有关是(欧洲西部)。我已经用Heroku的支持提出了它,并且如果我得到一个答案,我会回答这个问题,希望是一个有效的解决方案或解决方法。

2 个答案:

答案 0 :(得分: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
  });
});

答案 1 :(得分:0)

我正在关闭此问题,因为此问题现在似乎与AWS中可用区域的差异有关,即Heroku应用程序(美国)和RDS(EU)之间的差异。

尽管按照RDS开发人员工具演练中的建议更改了区域,但Heroku仍然无法与我的RDS进行交互。

解决方法是更改​​RDS数据库的安全组策略以允许所有连接:

0.0.0.0/0

或将数据库移至美国可用区。

很难理想。

我现在已经等待了四天来Heroku支持的回复以及其他任何建议,所以如果他们回来我会将它们添加到这个答案中。