皆さんこんにちはヒロウミです。
最近node.jsの勉強を初めて、ビギナーのための Node.jsプログラミング入門:こちらのサイトでチュートリアルを行っていたところ、PostgreSQLとの接続ではじかれたので、その解決方法を備忘録として残しておきたいと思います。
1.エラー内容
チュートリアルに従いコーディングを行って、ページにアクセスすると以下のようなエラーがでます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
# 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文書」より引用