无法读取null的属性'query'?

问题描述 投票:0回答:1
var express = require('express');
var pg = require('pg');
var app = express();

var connectionString = "postgres://...";

app.get('/', function (req, res, next) {
    pg.connect(connectionString, function (err, client, done) {
        if (err) {
            console.log("not able to get connection " + err);
            res.status(400).send(err);
        }
        client.query('SELECT * FROM employee WHERE empid=$1', [1], function (err, result) {
                done(); // closing the connection;
                if (err) {
                    console.log(err);
                    res.status(400).send(err);

                }
                res.status(200).send(result.rows);

            });
    });
});

app.listen(3000, function () {
    console.log('Server is running.. on Port 3000');
});

这是我的nodejs文件,而connectionString是连接heroku和postgreSQL的数据库信息。

但是当我运行这个时,我只会得到

client.query('SELECT * FROM employee WHERE empid=$1', [1], function (err, result) {
               ^

TypeError: Cannot read property 'query' of null

我该如何解决?

node.js postgresql heroku
1个回答
0
投票

在您的错误处理程序中:

    if (err) {
        console.log("not able to get connection " + err);
        res.status(400).send(err);
    }
    client.query(...)

您需要添加一个返回值,以便在发送错误状态后,代码不会继续尝试执行client.query(),因为如果发生错误,client中没有有效值。因此,更改为:

    if (err) {
        console.log("not able to get connection " + err);
        res.status(400).send(err);
        return;
    }
    client.query(...)

尽管影响较小,但在这里也是如此:

            if (err) {
                console.log(err);
                res.status(400).send(err);

            }
            res.status(200).send(result.rows);

您需要在其中添加退货的地方:

            if (err) {
                console.log(err);
                res.status(400).send(err);
                return;
            }
            res.status(200).send(result.rows);

这两种情况的总体问题是,尽管res.status(...).send(...)将响应发送回客户端,但它并不会阻止代码在此后继续执行,因此您仍然需要使用if/else或适当的[ C0]来控制代码的执行流程,因此在发生错误后,它不会立即执行您不希望执行的代码的其他部分。

© www.soinside.com 2019 - 2024. All rights reserved.