绑定云代工的服务无法正常工作
我已经从市场上创build了postgress服务(通过cf创build服务),我想在我的node.js应用程序中使用它(我能够在本地testing它的工作原理)第二个问题
1.我试过以下,应用程序无法启动,并在日志中,我得到了这个作为我的值为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:mlofvwfsxmf7bqjr@10.0.97.135: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:hvevfgpjjtyqpr1d@10.0.97.140: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
根据node-dbi的代码 ,pg适配器build立连接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.portvariables,所以这可以解释你的bug,因为如果我们相信显示的“url”ENVvariables,pg库永远不会被赋予你的postgres实例被认为侦听的34607端口在您的文章。
还要注意,node-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();
更新
给定的解决scheme导致错误
OUT ERROR: connect: Error: getaddrinfo ENOTFOUND undefined undefined:5432
这往往表明dsn没有被给予或不被pg
分析。 这导致我看到node-dbi
使用一个非常旧的版本的pg
。 所以我们不应该尝试使用连接参数作为string。
你确认你使用的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版本的date从2014年1月开始,postgres dsn处理是从2015年1月份开始的,所以还没有发布。
你的日志有一个差异,我不明白为什么说,主机是未定义的,所以我会绕过它使用uri直接,因为这似乎是正确的。
看看node-dbi
如何构buildpg连接string,你可以试试
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, {})