(node.js) Cannot read property ‘query’ of nullでひっかかった話

投稿者: | 2016年10月3日

皆さんこんにちはヒロウミです。

最近node.jsの勉強を初めて、ビギナーのための Node.jsプログラミング入門:こちらのサイトでチュートリアルを行っていたところ、PostgreSQLとの接続ではじかれたので、その解決方法を備忘録として残しておきたいと思います。

1.エラー内容

チュートリアルに従いコーディングを行って、ページにアクセスすると以下のようなエラーがでます。

# node bin/www

/root/expPgsql/routes/index.js:11
    client.query('select * from mydaya;', function(err, result){
          ^

TypeError: Cannot read property 'query' of null
    at /root/expPgsql/routes/index.js:11:11
    at BoundPool.<anonymous> (/root/expPgsql/node_modules/pg-pool/index.js:62:11)
    at /root/expPgsql/node_modules/generic-pool/lib/generic-pool.js:339:9
    at BoundPool.<anonymous> (/root/expPgsql/node_modules/pg-pool/index.js:45:7)
    at Connection.<anonymous> (/root/expPgsql/node_modules/pg/lib/client.js:185:5)
    at emitOne (events.js:96:13)
    at Connection.emit (events.js:188:7)
    at Socket.<anonymous> (/root/expPgsql/node_modules/pg/lib/connection.js:121:12)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)

 

2.エラー詳細を出力させる

上記にエラーだけでは理由が分からなかったので、コード中にエラーログの出力文を追加し、エラー詳細を確認。

    if (err){
      console.log(err); 
    };

# node bin/www 

{ error: ユーザ"postgres"のIdent認証に失敗しました
    at Connection.parseE (/root/expPgsql/node_modules/pg/lib/connection.js:554:11)
    at Connection.parseMessage (/root/expPgsql/node_modules/pg/lib/connection.js:381:17)
    at Socket.<anonymous> (/root/expPgsql/node_modules/pg/lib/connection.js:117:22)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at readableAddChunk (_stream_readable.js:176:18)
    at Socket.Readable.push (_stream_readable.js:134:10)
    at TCP.onread (net.js:543:20)

〜省略〜

何やら「Ident認証」というのに失敗しているらしい。

3.PostgreSQLの設定ファイルを編集する

/var/lib/pgsql/data/pg_hba.conf

 81 local   all             all                                     trust
 82 # IPv4 local connections:
 83 host    all             all             127.0.0.1/32            trust
 84 # IPv6 local connections:
 85 host    all             all             ::1/128                 trust

とりあえずすべて「trust」に変えてみたらうまくいきました。

ですがこれはあくまで、テスト環境での一時しのぎの対応なので、本番環境などでは行わないでください。

最後にPostgreSQLの認証パターンをメモっておこうと思います。

trust認証 trust認証が指定されるとPostgreSQLは、サーバに接続できる全ての人に対して (データベーススーパーユーザさえも)その人が指定する任意のデータベースユーザ名としてのアクセス権限が付与されていると想定します。
ident認証 ident認証方式は、クライアントのオペレーティングシステムのユーザ名を入手し、それを(オプションのユーザ名マップとともに)許可されているデータベースのユーザ名として使用します。
peer認証 peer認証方式はカーネルからクライアント上のオペレーティングシステムのユーザ名を取得し、 それをデータベースユーザ名(オプションのユーザ名マップとともに)として使用することにより動作します。この方法はローカル接続でのみ使用可能です。

「PostgreSQL 9.1.5文書」より引用