皆さんこんにちはヒロウミです。
最近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認証方式はカーネルからクライアント上のオペレーティングシステムのユーザ名を取得し、 それをデータベースユーザ名(オプションのユーザ名マップとともに)として使用することにより動作します。この方法はローカル接続でのみ使用可能です。 |