7

Ich habe den Postgreß-Service (über cf create-service) vom Marktplatz erstellt und möchte ihn in meiner node.js-App verwenden (ich konnte ihn lokal testen) works) ive zwei FrageBinden von Diensten in der Cloud Gießerei funktioniert nicht

1.i've folgendes versucht und die Anwendung tut der Lage zu starten und im Protokoll ich habe dies als mein Wert für die env varible, was ich hier fehlt? Diese

ist der Code:

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

dies als mein Wert für die env varible was ich hier fehlt?

 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: "); 
     } 
    }); 

    })(); 

Update (nach Jerome Antwort ...) Dies ist mein Code !!!

"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); 
       } 
      }); 
     }); 

    })(); 


}); 

Jetzt habe ich diesen Fehler

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 - Dank aber das ist nicht helping..ready read that :) –

+0

Warum gibt es so viele Diskrepanzen zwischen dem Fehler Host und Port und dem tatsächlichen Host und Port. Der Host in der Umgebungsvariablen und im Port unterscheidet sich von dem in der URL und dem Fehler. Kannst du klären, was hier vor sich geht? – 10100111001

Antwort

4

Nach dem code of node-dbi, die pg Adapter baut die Verbindung url als

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); 

Sehen Sie Ihre Fehlermeldung,

ERROR: connect: Error: connect ECONNREFUSED 10.0.97.135:5432 

Ihr Code versucht, eine Verbindung zum standardmäßigen postgres-Port 5432 herzustellen, was darauf hinweist, dass der Port nicht korrekt an pg weitergeleitet wurde. Der node-dbi-Quellcode verwendet nicht die Variable cfg.port, so dass dies Ihren Fehler erklären könnte, da die pg-Bibliothek niemals den 34607-Port erhält, auf dem Ihre postgres-Instanz angeblich hört, wenn wir an die angezeigte ENV-Variable "url" glauben in deinem Beitrag.

Beachten Sie auch, dass der Knoten-dbi bevorzugt die dsn, wenn es vorhanden ist:

this._pgUrl = connectionParams["dsn"]; 

Sie scheinen die dsn in der ENV zu haben, unter dem Namen 'url'.

Es ist schwer, Ihnen die genaue Korrektur von außen zu geben, aber ich glaube, es mit

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(); 

aktualisieren

Die gegebene Lösung führt zum Fehler

OUT ERROR: connect: Error: getaddrinfo ENOTFOUND undefined undefined:5432 
arbeiten sollte

, die tendenziell zeigen, dass der DSN nicht korrekt angegeben oder von pg korrekt analysiert wurde. Dies führt mich zu sehen, dass node-dbi eine sehr alte Version von pg verwendet. Wir sollten also nicht versuchen, den Verbindungsparameter als String zu verwenden.

Bestätigen Sie, dass die von Ihnen verwendete node-dbi Version 0.7.1 ist?

Ich habe gerade node-dbi installiert. Es gab mir 0,7.1, wo ich lesen kann

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

so entspricht dieser Code nicht, was wir auf Github sehen. Der DSN wird in dieser Version nicht behandelt.

Dies kann über https://github.com/DrBenton/Node-DBI/commits/master bestätigt werden. Die 0.7.1-Version stammt aus Januar 2014 und die postgres dsn Handhabung ist von Januar 2015, so dass es noch nicht veröffentlicht wurde ...

Es gibt eine Diskrepanz in Ihrem Protokoll und ich verstehe nicht, warum es diesen Host angibt ist undefiniert, also werde ich es direkt mit uri umgehen, da das uri korrekt zu sein scheint.

Zu sehen, wie node-dbi die pg Verbindungszeichenfolge erstellt, können Sie

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(); 

versuchen Sobald Sie es funktioniert, wird es an der Zeit zu sein, wahrscheinlich fragen, warum node-dbi scheint so „zerbrechlich“ und eine andere Datenbank-Wrapper wie sequelize verwenden zum Beispiel, wenn Sie nicht direkt pg verwenden möchten.

sollte es dann mit der Arbeit

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

gemäß http://docs.sequelizejs.com/en/latest/api/sequelize/

+0

Danke Ich habe die Frage zu aktualisieren (mit Ihren Anregungen .. .) mit dem ganzen Code, den ich benutze und ich habe immer noch Fehler ... irgendeine Idee? –

+0

wenn es andere connector gibt, die auch gut funktionieren können ... –

+0

Sicher werde ich es bald testen und euch wissen lassen, dass mein Team die Verwendung von node zu java ändern will :(, wie kann ich das selbe machen Java? Können Sie einfache E2E-Beispiel bieten, wie es empfohlen, in Java zu arbeiten? dont worry:) Wenn die Knotenlösung funktioniert, werde ich die Frage als Antwort markieren! Vielen Dank! –