7

Я создал службу postgress (через cf create-service) с рынка и хочу использовать его в моем приложении node.js (я смог проверить его локально, работы) ив два вопросасвязывать услуги в облачном литейном цехе не работает

1.i've попытался следующие, и приложение оленья кожа в состоянии начать и в журнале я это как мое значение для окр varible, что я здесь отсутствует?

Это код:

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

это как мое значение для окр 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); 
       } 
      }); 
     }); 

    })(); 


}); 

Теперь я получил эту ошибку

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

Согласно code of node-dbi, адаптер пг строит URL-соединения как

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

Проводы Ваше сообщение об ошибке,

ERROR: connect: Error: connect ECONNREFUSED 10.0.97.135:5432 

ваш код пытается подключиться к порту postgres по умолчанию, 5432, который намекает на то, что порт неправильно перенаправлен на pg. Исходный код node-dbi не использует переменную cfg.port, поэтому это может объяснить вашу ошибку, поскольку библиотеке pg никогда не предоставляется порт 34607, на котором предположительно прослушивается ваш экземпляр postgres, если мы считаем, что указана переменная ENV, отображаемая в вашем посте.

Следует также отметить, что узел-DBI предпочитает DSN, когда она существует:

this._pgUrl = connectionParams["dsn"]; 

Вы, кажется, имеют DSN в ENV, под названием 'URL'.

Трудно дать вам точное исправление с внешней стороны, но я считаю, он должен работать с

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

Update

Данное решение приводит к ошибке

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 года, а обработка postgres dsn - с января 2015 года, поэтому она еще не опубликована ...

В вашем журнале есть несоответствие, и я не понимаю, почему в нем указано, что хост не определено, поэтому я обойду его с помощью uri непосредственно, так как uri кажется правильным.

Видя, как node-dbi строит строку подключения пга, вы можете попробовать

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

После того, как вы получите его работу, это будет время, наверное, интересно, почему node-dbi кажется «хрупким» и использовать другую оболочку базы данных как sequelize например, если вы не хотите напрямую использовать pg.

Затем он должен работать с

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

согласно http://docs.sequelizejs.com/en/latest/api/sequelize/

+0

Спасибо, что обновил вопрос (с вашими предложениями .. .) со всем кодом, который я использую, и у меня все еще есть ошибка ... любая идея? –

+0

если есть другой разъем, который может работать так же хорошо ... –

+0

Конечно, я проверил его в ближайшее время и сообщит вам, кстати, моя команда хочет изменить использование с узла на java :(, как я могу сделать то же самое в java? можете ли вы предоставить простой пример E2E, как он рекомендовал работать в java? Не волнуйтесь:) если решение узла будет работать, я постараюсь ответить на вопрос как ответ! благодаря! –

Смежные вопросы