2017-07-11 36 views
0

我一直忠實地遵循有關Heroku和Node.js入門的優秀示例。直到數據庫部分。運行Heroku Node.js時遇到的錯誤入門示例 - 數據庫部分

我:

  1. 創建的數據庫。
  2. 我可以通過Heroku Database Dashboard訪問數據庫。
  3. 我已經創建了一個表格並通過heroku pg:psql控制檯將數據插入到表格中。
  4. 我可以通過控制檯對錶執行sql查詢。

但是當我嘗試,並通過在index.js路由連接&查詢的數據,我遇到連接到數據庫的錯誤。

生成的連接字符串如下:heroku config,其中包含所需的憑據,如預期的那樣。

=== aqueous-eyrie-10062 Config Vars 
DATABASE_URL:   postgres://uqeeuludvmhdzx:[email protected]azonaws.com:5432/dbpa7e9l3b2k8g 
PAPERTRAIL_API_TOKEN: T8Y4ESxxxxxxxx0rexl 
TIMES:    7 

起始本地實例heroku local db2(或瀏覽到localhost:5000/db2)後,控制檯顯示以下輸出:(用戶的羅伯特'是當前窗口用戶順便說一句)

生成該錯誤由PG-查詢呼叫以及在其他路由pg.connect呼叫(/分貝)

C:\Users\rober\node-js-getting-started>heroku local 
[OKAY] Loaded ENV .env File as KEY=VALUE Format 
14:23:52 web.1 | Node app is running on port 5000 
14:23:55 web.1 | (node:13876) DeprecationWarning: PG.connect is deprecated - please see the upgrade guide at https://node-postgres.com/guides/upgrading 
14:23:55 web.1 | result: undefined 
14:23:55 web.1 | rows: undefined 
14:23:55 web.1 | err: error: role "rober" does not exist 
14:23:55 web.1 | err: {"name":"error","length":90,"severity":"FATAL","code":"28000","file":"miscinit.c","line":"494","routine":"InitializeSessionUserId"} 
下面

是index.js

var cool = require('cool-ascii-faces') 
var express = require('express'); 
var app = express(); 
var pg = require('pg'); 
var pool = new pg.Pool(); 
var query2 = require('pg-query'); 

app.set('port', (process.env.PORT || 5000)); 

app.use(express.static(__dirname + '/public')); 

// views is directory for all template files 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'ejs'); 

app.get('/db', function (request, response) { 
    // ERROR received from below line 
    pg.connect(process.env.DATABASE_URL, function(err, client, done) { 
     if (client) { 
      var date = new Date(); 
      var query = client.query('SELECT * FROM test_table',function(err, result) { 
       if(!err) { 
        response.send(JSON.stringify(result.rows)); 
        accounts = JSON.stringify(result.rows); 
       } else { 
        response.send('failed'); 
       } 
       done(); // call done to close the conection 
      }); 
     } else { 
      response.send('No Client Error - ' + JSON.stringify(err)); 
      throw(err); 
     } 
    }); 
}); 

app.get('/db2', function(request, response) { 
    // ERROR received from below line 
    query2.connectionParameters = process.env.DATABASE_URL; 

    //accepts optional array of values as 2nd parameter for parameterized queries 
    query2('SELECT $1::text as name', ['rob'], function(err, rows, result) { 
     console.log('result: ' + result); 
     console.log('rows: ' + rows); 
     console.log('err: ' + err); 
     console.log('err: ' + JSON.stringify(err)); 
    }); 
}); 

我的package.json如下:

{ 
    "name": "node-js-getting-started", 
    "version": "0.2.6", 
    "description": "A sample Node.js app using Express 4", 
    "engines": { 
    "node": "6.10.2" 
    }, 
    "main": "index.js", 
    "scripts": { 
    "start": "node index.js" 
    }, 
    "dependencies": { 
    "cool-ascii-faces": "1.3.4", 
    "ejs": "2.5.6", 
    "express": "4.15.2", 
    "pg": "6.4.0", 
    "pg-query": "0.11.0" 
    }, 
    "repository": { 
    "type": "git", 
    "url": "https://github.com/heroku/node-js-getting-started" 
    }, 
    "keywords": [ 
    "node", 
    "heroku", 
    "express" 
    ], 
    "license": "MIT" 
} 

據筆者瞭解,該數據庫用戶應該從連接字符串從當前用戶獲得的,而不是。我該如何糾正這一點?

回答

0

OK - 感謝團隊成員,我已成功地解決這個問題:

我的假設是,heroku config設置運行heroku local的時候是可利用的 - 錯!

要在部署之前進行本地測試,我需要使用SET命令將DATABASE_URL設置爲Windows環境變量。

SET DATABASE_URL=postgres://uqexxxxxxhdzx:[email protected]com:5432/dbpa7e9l3b2k8g 

我接着就從我上面的代碼中刪除所有額外的連接方法,直到我只有

var pg = require('pg'); 

app.get('/db', function (request, response) { 
    pg.defaults.ssl = true; 
    pg.connect(process.env.DATABASE_URL, function(err, client) { 
     if (err) throw err; 
     console.log('Connected to postgres! Getting schemas...'); 

     client 
      .query('SELECT table_schema,table_name FROM information_schema.tables;') 
      .on('row', function(row) { 
       console.log(JSON.stringify(row)); 
      }); 
    }); 
}); 

這完美的作品。

0

以下代碼適用於我。

app.get('/db', function (request, response) { 
pg.defaults.ssl = true; 
pg.connect(process.env.DATABASE_URL, function(err, client) { 
    if (err) throw err; 
    console.log('Connected to postgres! Getting schemas...'); 

    client 
     .query('SELECT * FROM test_table;', function(err, result) { 

      if (err) 
      { console.error(err); response.send("Error " + err); } 
      else 
      { response.render('pages/db', {results: result.rows}); } 
     }); 

}); 

});