7

ho creato il servizio di posta (tramite cf create-service) dal marketplace e voglio usarlo nella mia app node.js. (Sono stato in grado di testarlo localmente opere) ive due domandabind services in cloud foundry not working

1.i've provato quanto segue e per la squadra di applicazione in grado di avviare e nel registro ho avuto questo come il mio valore per la ENV varible quello che mi manca qui?

Questo è il codice:

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

questo come il mio valore per la varible ENV quello che mi manca qui?

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

    })(); 

aggiornamento (dopo la risposta Jerome ...) Questo è tutto il mio codice !!!

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

    })(); 


}); 

Ora ho ottenuto questo errore

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 - grazie, ma questo non è help..already read that :) –

+0

Perché c'è molta discrepanza tra l'host e la porta di errore e l'host e la porta effettivi. L'host nella variabile di ambiente e nella porta è diverso da quello nell'url e nell'errore. Puoi chiarire cosa sta succedendo qui? – 10100111001

risposta

4

Secondo il code of node-dbi, l'adattatore pg costruisce l'URL di connessione come

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

Vedendo il vostro messaggio di errore,

ERROR: connect: Error: connect ECONNREFUSED 10.0.97.135:5432 

il tuo codice sta tentando di connettersi alla porta postgres predefinita, 5432, il che allude al fatto che la porta non è correttamente inoltrata a pg. Il codice sorgente del nodo-dbi non usa la variabile cfg.port in modo che questo possa spiegare il tuo bug dato che la libreria pg non riceve mai la porta 34607 su cui si suppone che l'istanza di postgres stia ascoltando se crediamo che la variabile ENV 'url' che viene mostrata nel tuo post.

Si noti inoltre che il nodo-dbi preferisce il DSN quando esiste:

this._pgUrl = connectionParams["dsn"]; 

Sembra che tu abbia il DSN nella ENV, sotto il nome di 'url'.

E 'difficile dare la correzione esatto dal di fuori, ma credo che dovrebbe funzionare con

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

Aggiornamento

La data soluzione porta all'errore

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

che tende a mostrare che il dsn non è dato o non analizzato correttamente da pg. Questo mi ha portato a vedere che node-dbi utilizza una versione molto vecchia di pg. Quindi non dovremmo provare forse a usare la connessione param come una stringa.

Confermate che la versione node-dbi che utilizzate sia 0.7.1?

Ho appena installato node-dbi. Mi ha dato 0.7.1, dove posso leggere

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

quindi questo codice non corrisponde a quello che vediamo su github. Il dsn non è gestito in questa versione.

Questo può essere confermato tramite https://github.com/DrBenton/Node-DBI/commits/master. La versione 0.7.1 risale a gennaio 2014 e la gestione di postgres dsn è da gennaio 2015 quindi non è stata ancora pubblicata ...

C'è una discrepanza nel tuo log e non capisco perché afferma che host non è definito, quindi lo bypasserò usando uri direttamente poiché l'uri sembra corretto.

Vedendo come node-dbi costruisce la stringa di connessione PG, si può provare

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

Una volta che si ottiene lavorando, sarà il momento di chiedersi probabilmente il motivo per node-dbi sembrano così "fragile" e utilizzare un altro involucro di database come sequelize per esempio se non vuoi usare direttamente lo pg.

Deve quindi lavorare con

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

secondo http://docs.sequelizejs.com/en/latest/api/sequelize/

+0

Grazie ho aggiornato la domanda (con i tuoi suggerimenti .. .) con tutto il codice che uso e ho ancora errore ... qualche idea? –

+0

se c'è un altro connettore che può funzionare anche bene ... –

+0

Certo che lo proverò presto e ti faccio sapere, btw il mio team vuole cambiare l'uso da nodo a java :(, come posso fare lo stesso in java? puoi fornire un semplice esempio E2E su come si consiglia di lavorare in java? Non preoccuparti:) se la soluzione del nodo funzionerà segnerò la domanda come risposta! Grazie! –