7

마켓 플레이스에서 (cf create-service를 통해) 포스트 레스 드 서비스를 생성했으며이를 node.js 앱에서 사용하고 싶습니다. (로컬로 테스트 할 수있었습니다. 작품) 두 가지 질문클라우드 파운드리의 바인드 서비스가 작동하지 않습니다.

1.i've을 필자는 다음과 수 응용 프로그램 나던 시작하고 로그에 나는 ENV varible 내 값으로 이있어 내가 여기를 놓친 거지 시도?

이 코드입니다 :

OK i've tried the following and the application doesnt able to start and in the log I got 

이 내가 여기에 놓친 거지 무엇 ENV의 varible 내 값으로?

 OUT env variable host: 10.0.97.139 
    OUT port: 34807 
    OUT user: qmxgvfybloierztm 
    OUT password: mlofvwfsxmf7bqjr 
    OUT database: r8n13yjyql7hwrgc 
    OUT url: postgres://qmxgvfybloierztm:[email protected]:34607/r8n13yjyql7hwrgc 
    OUT start create table 
    OUT ERROR: connect: Error: connect ECONNREFUSED 10.0.97.135:5432 




(function(){ 

    if (null == process.env.VCAP_SERVICES) { 
     var url = 'postgress://localhost:27017/local'; 
    } 
    else { 
     var vcap_services = JSON.parse(process.env.VCAP_SERVICES); 

     console.log("postgress URL: ", url); 
    }; 

    var DBWrapper = require('node-dbi').DBWrapper; 

    var dbConnectionConfig = { 
     uri: vcap_services['postgresql'][0].credentials.uri, 
     host: vcap_services['postgresql'][0].credentials.hostname, 
     port: vcap_services['postgresql'][0].credentials.port, 
     database: vcap_services['postgresql'][0].credentials.dbname, 
     user: vcap_services['postgresql'][0].credentials.username, 
     password: vcap_services['postgresql'][0].credentials.password 
    }; 

    var dbWrapper = new DBWrapper('pg', dbConnectionConfig); 

    dbWrapper.connect(); 

    console.log("start create table"); 
    dbWrapper.query("CREATE TABLE IF NOT EXISTS TAB1 (firstname TEXT primary key, lastname varchar(20))", function (err, results) { 
     if (err) { 
      console.log("error while inserting data " + err); 
     } else { 
      console.log("success to insert data: "); 
     } 
    }); 

    })(); 

업데이트 (제롬 응답 후 ...)이 내 모든 코드입니다!

"use strict"; 

var express = require("express"); 
var path = require("path"); 


var app = express(); 


var port = process.env.PORT || 3000; 

app.listen(port, function() { 


    (function() { 


     var DBWrapper = require('node-dbi').DBWrapper; 
     var vcap_services = JSON.loparse(process.env.VCAP_SERVICES); 
     var pgconf = vcap_services['postgresql'][0].credentials; 
     var dbConnectionConfig = { 
      dsn: pgconf.uri 
     }; 
     var dbWrapper = new DBWrapper('pg', dbConnectionConfig); 
     dbWrapper.connect(); 


     console.log("env variable host: " + pgconf.hostname) 
     console.log("port: " + pgconf.port); 
     console.log("user: " + pgconf.user); 
     console.log("password: " + pgconf.password); 
     console.log("database: " + pgconf.database); 
     console.log("url: " + pgconf.uri); 


     console.log("start create table"); 
     dbWrapper.query("CREATE TABLE IF NOT EXISTS USER (firstname TEXT primary key, lastname varchar(20))", function (err, results) { 
      if (err) { 

       console.log("error while inserting data " + err); 
      } else { 
       console.log("success to insert data: "); 
      } 
     }); 


     var data = 
     { 
      firstname: 'John5', 
      lastname: 'Foo4444' 
     }; 

     //insert data 
     dbWrapper.insert('USER', data, function (err, data) { 
      if (err) { 
       console.log("error to insert data: " + err); 
       // John has been inserted in our table, with its properties safely escaped 
      } else { 
       console.log("test" + data); 
      } 

     }); 

     //read data 
     dbWrapper.fetchAll("SELECT * FROM USER", null, function (err, result) { 
      if (!err) { 
       console.log("Data came back from the DB.", result); 
      } else { 
       console.log("DB returned an error: %s", err); 
      } 

      dbWrapper.close(function (close_err) { 
       if (close_err) { 
        console.log("Error while disconnecting: %s", close_err); 
       } 
      }); 
     }); 

    })(); 


}); 

지금 나는 code of node-dbi에 따르면이 오류

2016-07-26T11:55:49.69+0300 [App/0]  OUT env variable host: undefined 
2016-07-26T11:55:49.69+0300 [App/0]  OUT port: 35058 
2016-07-26T11:55:49.69+0300 [App/0]  OUT user: undefined 
2016-07-26T11:55:49.69+0300 [App/0]  OUT password: hvevfgpjjtyqpr1d 
2016-07-26T11:55:49.69+0300 [App/0]  OUT database: undefined 
2016-07-26T11:55:49.69+0300 [App/0]  OUT url: postgres://fakttklwkxtfprgv:[email protected]:35058/ispkmc5psgdrwj4e 
2016-07-26T11:55:49.69+0300 [App/0]  OUT start create table 
2016-07-26T11:55:49.69+0300 [App/0]  OUT ERROR: connect: Error: getaddrinfo ENOTFOUND undefined undefined:5432 
+0

https://docs.cloudfoundry.org/devguide/services/application-binding.html –

+0

@AmitKumarGupta와 함께 작동합니다 - 감사합니다하지만이 아니다 돕고 .. 이미 읽었습니다. :) –

+0

오류 호스트와 포트, 그리고 실제 호스트와 포트간에 너무 많은 불일치가있는 이유는 무엇입니까? 환경 변수 및 포트의 호스트가 URL 및 오류의 호스트와 다릅니다. 여기서 무슨 일이 일어나고 있는지 명확히 할 수 있습니까? – 10100111001

답변

4

을 가지고는 페이지 어댑터는 오류 메시지가 표시

var cfg = this._connectionParams; 
if (connectionParams["dsn"]) { 
    this._pgUrl = connectionParams["dsn"]; 
} else { 
    this._pgUrl = 'pg://'+cfg.user+':'+cfg.password+'@'+cfg.host+'/'+cfg.database; 
} 
this._dbClient = new pg.Client(this._pgUrl); 

로 연결 URL을 빌드

ERROR: connect: Error: connect ECONNREFUSED 10.0.97.135:5432 

코드가 기본 postgres 포트 인 5432에 연결을 시도하고 있습니다.이 포트는 포트가 pg로 올바르게 전달되지 않았다는 것을 암시합니다. node-dbi 소스 코드는 cfg.port 변수를 사용하지 않으므로 버그를 설명 할 수 있습니다. 왜냐하면 표시된 'url'ENV 변수가 있다고 판단되면 pg 라이브러리에 postgres 인스턴스가 수신되는 34607 포트가 제공되지 않기 때문입니다 귀하의 게시물에 이 존재하는 경우

참고 또한 노드 DBI는 DSN을 선호 :

this._pgUrl = connectionParams["dsn"]; 

당신은 이름이 'URL'아래 ENV에서 DSN을 갖고있는 것 같다.

당신에게 외부에서 정확한 수정 프로그램을 제공하기 어렵다, 그러나 나는

var DBWrapper = require('node-dbi').DBWrapper; 
var pgconf = vcap_services['postgresql'][0].credentials; 
var dbConnectionConfig = { 
    dsn: pgconf.url 
}; 
var dbWrapper = new DBWrapper('pg', dbConnectionConfig); 
dbWrapper.connect(); 

업데이트

주어진 솔루션은 오류

OUT ERROR: connect: Error: getaddrinfo ENOTFOUND undefined undefined:5432 
리드와 함께 작동한다고 생각

dsn이 제공되지 않았거나 정확하게 분석되지 않은 경향이있는 경향이 있습니다 (pg). 이로 인해 node-dbi은 매우 오래된 버전 인 pg을 사용하고 있습니다. 따라서 연결 매개 변수를 문자열로 사용하려고해서는 안됩니다.

사용중인 node-dbi 버전이 0.7.1인지 확인합니까?

node-dbi을 방금 설치했습니다. 그것은 나에게 0.7을 줬다.1, 어디서 읽을 수 있습니까

var cfg = this._connectionParams; 
this._pgUrl = 'pg://' + cfg.user + ':' + cfg.password + '@' + cfg.host + '/' + cfg.database; 
this._dbClient = new pg.Client(this._pgUrl); 

이 코드는 우리가 github에서 보는 것과 일치하지 않습니다. dsn은이 버전에서 처리되지 않습니다.

https://github.com/DrBenton/Node-DBI/commits/master을 통해 확인할 수 있습니다. 0.7.1 버전의 날짜는 2014 년 1 월이고 postgres dsn 처리는 2015 년 1 월이므로 아직 게시되지 않았습니다 ...

로그에 차이가 있으며 그 호스트가 왜 그런지 알 수 없습니다. uri가 올바른 것 같아서 uri를 직접 사용하지 않기 때문에 정의되지 않았습니다. node-dbi이 페이지의 연결 문자열을 빌드하는 방법을보고

, 당신은 당신이 그것을 작동하게되면, 아마 node-dbi 그래서 "깨지기 쉬운"보이는 이유를 궁금해하는 시간이 될 및 sequelize 같은 다른 데이터베이스 래퍼를 사용합니다

var url = require('url'); 
var DBWrapper = require('node-dbi').DBWrapper; 
var pgconf = vcap_services['postgresql'][0].credentials; 
console.log(pgconf.uri); 
var parts = url.parse(pgconf.uri); 
var dbConnectionConfig = { 
    user: parts.auth.split(':')[0], 
    password: parts.auth.split(':')[1], 
    host: parts.host, 
    database: parts.pathname.substr(1) 
}; 
var dbWrapper = new DBWrapper('pg', dbConnectionConfig); 
dbWrapper.connect(); 

을 시도 할 수 있습니다 예를 들어 pg을 직접 사용하지 않으려는 경우입니다.

그런 다음

var sequelize = new Sequelize(pgconf.uri, {}) 

같은 당 http://docs.sequelizejs.com/en/latest/api/sequelize/

+0

감사합니다. .) 내가 사용하는 모든 코드를 사용하면 여전히 오류가 발생합니다 ... 어떤 생각입니까? –

+0

좋은 일을 할 수있는 다른 커넥터가 있다면 ... –

+0

확실히 테스트 해보고 팀에서 자바에서 노드로 사용법을 변경하려고합니다. (어떻게해야합니까? java? 간단한 E2E 예제를 제공하여 Java에서 작동하는 것을 권장 할 수 있습니까? 걱정하지 마십시오.) 노드 솔루션이 작동하면 대답을 질문으로 표시 할 것입니다! 감사! –

관련 문제