2013-02-05 8 views
0

저는 처음 Node.js 응용 프로그램을 개발했습니다. 실제로 재미 있고 연습 할 수 있도록 이전 코드를 Node 노드로 옮겨서 Heroku에서 호스팅하고 있습니다.Heroku Node.js 응용 프로그램이 시작되지 않습니다.

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가 브라우저 나 로그에서 제공하는 유일한 오류이며, 구성하는 데 문제가없는 것 같습니다.

나는 여기에서 상실하고있다. 그래서 누군가가 내가 바보 인 곳을 지적 할 수 있기를 바란다.

미리 감사드립니다.

업데이트 : 로그에 오류를 캡처 파스칼 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 : 그것은 차이와 관련이 같은

일부 RDS의 보안 설정 손보는 업데이트 2에서 오류 메시지가 표시 및 수행 한 후이 지금 보이는 Heroku가 호스팅되는 곳 (us-west)과 내 RDS DB가있는 곳 (eu-west) 사이의 가용성 영역. 나는 Heroku 지원을 통해 그것을 제기했으며, 대답을 얻으면이 질문을 닫을 것이고, 잘하면 해결 방법이나 해결 방법을 얻을 수있을 것이다.

답변

0

이제 Heroku가 애플 리케이션 (US)이며, RDS는 (EU) 여기서 사이에 AWS에서 가용성 영역에서의 차이에 관련이있는 것으로 나타납니다.

RDS 개발자 도구 연습에서 제안한대로 영역을 변경하더라도 Heroku는 여전히 내 RDS와 상호 작용할 수 없습니다.

0.0.0.0/0 

또는 미국의 가용성 영역에 데이터베이스를 이동 :

이에 대한 해결 방법은 모든 연결을 허용하도록 RDS 데이터베이스에 대한 보안 그룹 정책을 변경하는 것입니다.

거의 이상적입니다.

나는 다른 제안과 함께 Heroku 지원부로부터 답장을 받기 위해 4 일을 기다렸으므로 다시 돌아 오면이 대답에 추가 할 것입니다.

1

첫 번째 줄의 오류 값을 확인하십시오.연결이 정의되지 않은 경우 오류가 발생했을 가능성이 큽니다.

또한 각 요청마다 새 연결을 가져온 다음 풀로 돌아와야합니다. 나는이 문제로 질문을 폐쇄하고있어

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 
    }); 
}); 
+0

조언 해 주셔서 감사합니다. 나는 네가 제안한 것을 시도했다. 이제 로그에 오류가있어 브라우저에서 플랫 응용 프로그램 오류가 발생합니다. 나는 그것으로 질문을 업데이트했다. – PenguinOfwar

관련 문제