-
Notifications
You must be signed in to change notification settings - Fork 0
Client
Your main interface point with the PostgreSQL server. Client is used to create & dispatch queries to Postgres. Client also emits events from Postgres for 'LISTEN/NOTIFY' processing and non-critical error and notice messages from the server.
- methods
- events
note: Client instances created via the constructor do not participate in pg's connection pooling. To take advantage of connection pooling (recommended) please use either pg-pool or a pooling utility such as pgbouncer.
This is the preferred way to create a client - let the client read its connection parameters out of environment variables: the client will read host, database, user, password, etc from the same environment variables used by postgres utilities
Creates a new, unconnected client from a url based connection string postgres://user:password@host:port/database
or from the location of a domain socket folder /tmp
or /var/run/postgres
.
Internally the connection string is parsed and a config object is created with the same defaults as outlined below. All parts of the connection string url are optional. This is handy for use in managed hosting like Heroku.
var client = new Client('postgres://brian:mypassword@localhost:5432/dev');
var client = new Client('postgres://brian@localhost/dev'); //will use defaults
var client = new Client(process.env.DATABASE_URL); //something like this should get you running with heroku
var client = new Client('/tmp'); //looks for the socket file /tmp/.s.PGSQL.5432
Url strings don't allow to pass special characters like #
If you have some in your password, don't use a connection string, use a config object and pass
it as { host: 'foo', password: 'blah#blah' }
Creates a new, unconnected instance of a Client configured via supplied configuration object.
-
object config: can contain any of the following optional properties
-
string user:
- default value:
process.env.USER
- PostgreSQL user
- default value:
-
string database:
- default value:
process.env.USER
- database to use when connecting to PostgreSQL server
- default value:
-
string password:
- default value:
null
- user's password for PostgreSQL server
- default value:
-
number port:
- default value:
5432
- port to use when connecting to PostgreSQL server
- used to initialize underlying net.Stream()
- default value:
-
string host:
- default value:
localhost
- host address of PostgreSQL server (or a path such as
/var/run/postgresql
for Unix sockets) - note:
localhost
still uses TCP (instead of Unix) sockets for the non-native connector - used to initialize underlying net.Stream()
- default value:
-
bool/object ssl:
- default value:
false
- whether to try SSL/TLS to connect to server
- if you wish to alter any SSL connection parameters, while using the the postgres javascript client implementation, pass the same options as tls.connect(). Default values for tls.connect() options are overridden by this module, pass them explicitly. Eg: to use SSL certificate verification, pass values to the
ca
parameter and set therejectUnauthorized
paramether totrue
- default value:
-
string application_name:
- default value:
process.env.PGAPPNAME
- name displayed in the
pg_stat_activity
view and included in CSV log entries
- default value:
-
string fallback_application_name:
- default value:
false
- fallback value for the
application_name
configuration parameter
- default value:
-
string user:
var client = new Client({
user: 'brianc',
password: 'boom!',
database: 'test',
host: 'example.com',
port: 5313
});
Will look for the Unix Domain Socket at /tmp/.s.PGSQL.5313
and connect with the rest of the supplied credentials:
var client = new Client({
user: 'brianc',
password: 'boom!',
database: 'test',
host: '/tmp',
port: 5313
});
Initializes Client's internal Connection object & net.Stream() instance. Starts communication with PostgreSQL server including password negotiation. If a callback is supplied it will be called with an instance of Error
if an error was encountered during the connection procedure, otherwise it will be called with null
for a single parameter after a connection to PostgreSQL server is established and the client is ready to dispatch queries.
note: Clients created via a pool are already connected and should not have their #connect method called.
Immediately sends a termination message to the PostgreSQL server and closes the underlying net.Stream().
note: Clients created via a pool will be automatically disconnected or placed back into the connection pool and should not have their #end method called directly.
query(string text, optional function callback) : Query
Simply: Creates a query object, queues it for execution, and returns it.
In more detail: Adds a Query to the Client's internal query queue. The query is executed as a simple query within PostgresSQL, takes no parameters, and it is parsed, bound, executed, and all rows are streamed backed to the Client in one step within the PostgreSQL server. For more detailed information you can read the PostgreSQL protocol documentation.
- string text: the query text
- optional function callback: optionally provided function which will be passed the error object (if the query raises an error) or the entire result set buffered into memory. note: do not provide this function for large result sets unless you're okay with loading the entire result set into memory
-
function callback(object error, object result)
- Called only if provided
- if passed, query will still raise the
row
andend
events but will no longer raise theerror
event - parameters
-
object error:
-
null
if there was no error - if PostgreSQL encountered an error during query execution, the message will be called here
-
-
object result:
- the result of the query, containing the same properties as the Result object in
end
event ofQuery
.
- the result of the query, containing the same properties as the Result object in
-
object error:
var client = new Client({user: 'brianc', database: 'test'});
client.on('drain', client.end.bind(client)); //disconnect client when all queries are finished
client.connect();
//query is executed once connection is established and
//PostgreSQL server is ready for a query
var query = client.query("SELECT name FROM users", function(err, result) {
console.log(result.rows[0].name);
})
var client = new Client();
client.query('SELECT NOW() as right_now')
.then(res => console.log(res.rows[0].right_now))
.then(() => client.end())
query( object config, optional function callback) : Query
query(string queryText, array values, optional function callback): Query
Creates an unnamed query object, queues it for execution, and returns it.
If name
is provided within the config
object the query will be executed as a prepared statement. Otherwise, if values
is provided within the config
object the query will be executed as a parameterized query. If Otherwise, it will behave in the same manner as a simple query.
var client = new Client({user: 'brianc', database: 'test'});
client.on('drain', client.end.bind(client)); //disconnect client when all queries are finished
client.connect();
var query = client.query({
text: 'SELECT name FROM users WHERE email = $1',
values: ['brianc@example.com']
}, function(err, result) {
console.log(result.rows[0].name) // output: brianc
});
var client = new Client({user: 'brianc', database: 'test'});
client.on('drain', client.end.bind(client)); //disconnect client when all queries are finished
client.connect();
client.query("SELECT name FROM users WHERE email = $1", ['brianc@example.com'], function(err, result) {
console.log(result.rows[0].name) // output: brianc
});
var client = new Client({user: 'brianc', database: 'test'});
client.on('drain', client.end.bind(client)); //disconnect client when all queries are finished
client.connect();
//object config method
var queryConfig = {
text: 'SELECT name FROM users WHERE email = $1',
values: ['brian@example.com']
};
client.query(queryConfig, function(err, result) {
assert.equal('brianc', result.rows[0]);
});
//text/params method
client.query('SELECT name FROM users WHERE email = $1', ['brian@example.com'], function(err, result) {
assert.equal('brianc', result.rows[0].name);
});
query(object config, optional function callback) : Query
(See Prepared Statements for a more detailed discussion of Prepared Statements in node-postgres
.)
Creates a named query object, queues it for execution, and returns it.:
- If and only if
name
is provided within theconfig
object does query result in a prepared statement. - If
text
andname
are provided within theconfig
, the query will result in the creation of a prepared statement. - If
values
andname
provided within theconfig
, the prepared statement will be executed. (Note: if the prepared statement takes no parameters, usevalues: []
.)
PostgreSQL server caches prepared statements by name on a per (postgres) session basis. Subsequent queries may refer to the prepared statement by name, and the PostgresQL server instance can skip the preparation step.
var client = new Client({user: 'brianc', database: 'test'});
client.on('drain', client.end.bind(client)); //disconnect client when all queries are finished
client.connect();
var first = client.query({
text: "SELECT email FROM users WHERE name = $1",
values: ['brianc'],
name: 'email from name'
});
first.on('row', function(row) {
assert.equal("brian@example.com", row.email);
});
var second = client.query({
name: 'email from name',
values: ['brianc']
});
second.on('row', function(row) {
assert.equal("brian@example.com", row.email);
});
//can still supply a callback method
var third = client.query({name: 'email from name', values: ['brianc']}, function(err, result) {
assert.equal('brian@example.com', result.rows[0].email);
});
-
object config: can contain any of the following optional properties
-
string text:
- The text of the query
-
example:
select name from user where email = $1
-
string name:
- The name of the prepared statement
- Can be used to reference the same statement again later and is used internally to cache and skip the preparation step
-
array values:
- The values to supply as parameters
- Values may be any object type supported by the Client
-
string text:
-
optional function callback: callback function
-
function callback(object error, object result)
- Called only if provided
- used as a shortcut instead of subscribing to the
row
query event - if passed, query will still raise the
row
andend
events but will no longer raise theerror
event - parameters
-
object error:
-
null
if there was no error - if PostgreSQL encountered an error during query execution, the message will be called here
-
-
object result:
- the result of the query, containing the same properties as the Result object in
end
event ofQuery
.
- the result of the query, containing the same properties as the Result object in
-
object error:
-
function callback(object error, object result)
Raised when the internal query queue has been emptied and all queued queries have been executed. Useful for disconnecting the client after running an undetermined number of queries.
var client = new Client({user: 'brianc', database: 'postgres'});
client.connect();
var users = client.query("select * from user");
var superdoods = client.query("select * from superman");
client.on('drain', client.end.bind(client));
//carry on doing whatever it was you wanted with the query results once they return
users.on('row', function(row){ ...... });
Raised when the client recieves an error message from PostgreSQL or when the underlying stream raises an error. The single parameter passed to the listener will be the error message or error object.
var client = new Client({user: 'not a valid user name', database: 'postgres'});
client.connect();
client.on('error', function(error) {
console.log(error);
});
Used for "LISTEN/NOTIFY" interactions. You can do some fun pub-sub style stuff with this.
var client1 = new Client(...)
var client2 = new Client(...)
client1.connect();
client2.connect();
client1.on('notification', function(msg) {
console.log(msg.channel); //outputs 'boom'
client1.end();
});
client1.query("LISTEN boom");
//need to let the first query actually complete
//client1 will remain listening to channel 'boom' until its 'end' is called
setTimeout(function() {
client2.query("NOTIFY boom", function() {
client2.end();
});
}, 1000);
Emitted from PostgreSQL server when non-critical events happen, for example a RAISE NOTICE
statement in a plpgsql function. When using connection pooling, be sure to attach the handler only once per client.
Libpq printf
's these out to stdout if the behavior is not overridden. Yucky. Thankfully node-postgres overrides the default behavior and emits an event (instead of printing to stdout) on the client which received the notice event.
var client = new Client(...)
client.on('notice', function(msg) {
console.log("notice: %j", msg);
});
//create a table with an id will cause a notice about creating an implicit seq or something like that...
client.query('create temp table boom(id serial, size integer)');
client.on('drain', client.end.bind(client));
Emitted when the connection is finished. It is useful when the pooling mechanism is external to pg.
client.on('end', function(){console.log("Client was disconnected.");