7

我已經從市場創建postgress服務(通過cf創建服務),我想在我的node.js應用程序中使用它(我能夠在本地測試它作品) 香港專業教育學院2個問題綁定服務在雲代工不工作

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

    })(); 


}); 

現在我得到這個錯誤

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時,PG適配器建立連接的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變量,所以這可以解釋您的錯誤,因爲如果我們相信顯示的'url'ENV變量,pg庫永遠不會被賦予您的postgres實例在其上偵聽的34607端口在你的文章中。也

注意節點DBI喜歡的DSN時,它的存在:

this._pgUrl = connectionParams["dsn"]; 

你似乎有在ENV的DSN,名稱爲「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(); 

更新

給出的解決方案導致錯誤

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構建皮克連接字符串,則可以嘗試

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中工作?別擔心:)如果節點解決方案能夠工作,我會將問題標記爲答案!謝謝! –