【问题标题】:Cannot read property 'query' of null?无法读取 null 的属性“查询”?
【发布时间】:2019-11-09 07:55:57
【问题描述】:
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

我该如何解决?

【问题讨论】:

  • 这意味着clientnull
  • 你使用的是哪个 postgres 模块?

标签: node.js postgresql heroku


【解决方案1】:

在您的错误处理程序中:

    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 或适当的流控制return 控制代码的执行流程,因此在出现错误后它不会立即执行您不希望执行的代码的其他部分。

【讨论】:

  • @김기훈 - 嗯,这是要解决的问题 - 显然还有更多问题。也许您没有正确使用pg.connect() 函数。我不知道那个 API,但我会查一下。您使用的是哪个确切的 postgres 模块?你能在 NPM 上提供一个链接吗?
  • @김기훈 - 我看到的文档 herehere 都显示了与您显示的不同的连接顺序。一个构造一个 Pool 对象,另一个构造一个 Client 对象,两者看起来都不像您的代码。您确定您的连接方式正确吗?
  • @김기훈 - 你弄清楚你的问题了吗?
猜你喜欢
  • 1970-01-01
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
相关资源
最近更新 更多