运行Heroku Node.js时遇到错误示例 - 数据库部分

时间:2017-07-11 13:30:47

标签: node.js heroku demo node-postgres

我一直忠实地关注Heroku和Node.js入门的优秀示例。直到数据库部分。

我有:

  1. 创建了数据库。
  2. 我可以通过Heroku Database Dashboard
  3. 访问数据库
  4. 我创建了一个表,并通过heroku pg:psql控制台将数据插入到表中。
  5. 我可以通过控制台对表执行sql查询。
  6. 但是,当我尝试连接&通过index.js中的路由查询数据,我遇到连接到DB的错误。

    生成的连接字符串如下所示heroku config,其中包含所需的凭据。

    === aqueous-eyrie-10062 Config Vars
    DATABASE_URL:         postgres://uqeeuludvmhdzx:6181554101xxxxxxxxxxxxxxxxxxxxxxa@ec2-107-21-113-16.compute-1.amazonaws.com:5432/dbpa7e9l3b2k8g
    PAPERTRAIL_API_TOKEN: T8Y4ESxxxxxxxx0rexl
    TIMES:                7
    

    启动本地实例heroku local db2(或浏览到localhost:5000/db2)后,控制台会显示以下输出:(用户'rober'是当前的Windows用户btw)

    错误是由pg-query调用以及其他路由(/ db)中的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"
    }
    

    根据我的理解,应该从连接字符串而不是当前用户获取db用户。我该怎么纠正这个?

2 个答案:

答案 0 :(得分:0)

OK - thanks to a team member, i have managed to resolve the issue:

my assumption was that heroku config settings were available when running heroku local - WRONG!

To locally test before deploy I needed to set the DATABASE_URL into the windows environment variables using the SET command.

SET DATABASE_URL=postgres://uqexxxxxxhdzx:6181554xxxxxxxxxxxxxxxxxa@ec2-107-21-113-16.compute-1.amazonaws.com:5432/dbpa7e9l3b2k8g

I then proceeded to remove all the additional connection methods from my code above until i had only

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

Which works perfectly.

答案 1 :(得分:0)

以下代码对我有用。

const puppeteer = require('puppeteer');

module.exports = class WebWrapper {

    constructor() {
        var browser;
        var page;
    } 

    async init() {
        this.browser = await puppeteer.launch(
        {
            headless: false
        });
        this.page = await this.browser.newPage();
        await this.page.setRequestInterceptionEnabled(true);

        await this.page.setViewport({
            width: 1920,
            height: 1080
        });

        await this.page.on('request', request => {
            request.continue(); // pass it through.
        });

        await this.page.on('response', response => {
            const req = response.request();
            console.log(req.method, response.status, req.url);
        });

        await this.page.goto('https://example.com');
        await this.page.screenshot({path: 'example.png'});
        console.log("A");
    }

    async close() {
        console.log("B");
        await this.browser.close();
    }

};

});