2012-02-09 18 views
90

Próbuję utworzyć bazę danych PostgreSQL, więc zainstalowałem PostgreSQL i uruchomiłem serwer z initdb /usr/local/pgsql/data, a następnie uruchomiłem tę instancję z postgres -D /usr/local/pgsql/data. Jak mogę z tym współdziałać poprzez węzeł ? Na przykład, czym byłby connectionstring, lub jak mogę się dowiedzieć, co to jest.Jak połączyć się z Postgresem za pośrednictwem Node.js

Odpowiedz

262

Oto przykład użyłem do połączenia pliku node.js z moją bazą danych Postgres.

Interfejs w node.js, że kiedyś można znaleźć tutaj https://github.com/brianc/node-postgres

var pg = require('pg'); 
var conString = "postgres://YourUserName:[email protected]:5432/YourDatabase"; 

var client = new pg.Client(conString); 
client.connect(); 

//queries are queued and executed one after another once the connection becomes available 
var x = 1000; 

while (x > 0) { 
    client.query("INSERT INTO junk(name, a_number) values('Ted',12)"); 
    client.query("INSERT INTO junk(name, a_number) values($1, $2)", ['John', x]); 
    x = x - 1; 
} 

var query = client.query("SELECT * FROM junk"); 
//fired after last row is emitted 

query.on('row', function(row) { 
    console.log(row); 
}); 

query.on('end', function() { 
    client.end(); 
}); 



//queries can be executed either via text/parameter values passed as individual arguments 
//or by passing an options object containing text, (optional) parameter values, and (optional) query name 
client.query({ 
    name: 'insert beatle', 
    text: "INSERT INTO beatles(name, height, birthday) values($1, $2, $3)", 
    values: ['George', 70, new Date(1946, 02, 14)] 
}); 

//subsequent queries with the same name will be executed without re-parsing the query plan by postgres 
client.query({ 
    name: 'insert beatle', 
    values: ['Paul', 63, new Date(1945, 04, 03)] 
}); 
var query = client.query("SELECT * FROM beatles WHERE name = $1", ['john']); 

//can stream row results back 1 at a time 
query.on('row', function(row) { 
    console.log(row); 
    console.log("Beatle name: %s", row.name); //Beatle name: John 
    console.log("Beatle birth year: %d", row.birthday.getYear()); //dates are returned as javascript dates 
    console.log("Beatle height: %d' %d\"", Math.floor(row.height/12), row.height % 12); //integers are returned as javascript ints 
}); 

//fired after last row is emitted 
query.on('end', function() { 
    client.end(); 
}); 
+18

Teraz ten typ przykładu chciałbym zobaczyć. Jasne i zawierające tylko tyle kodu. Dzięki JustBob. – Stradas

+1

Co dodano w pliku pg_hba.conf, aby zezwolić na połączenia z pliku node.js? Dzięki –

+3

host wszystkie 0.0.0.0/0 md5 Ten wpis będzie, jeśli dobrze pamiętam niech każdy IP połączyć. Należy pamiętać, że nie jest to specyficzne dla węzła, ale specyficzne dla PostgreSQL. Również w postgresql.conf mam listen_addresses = '*'. W przypadku konfiguracji produkcyjnych zapoznaj się z dokumentacją, aby upewnić się, że nie otwierasz otworów w dowolnym miejscu. Używam tego w mojej konfiguracji dev, więc nie ma problemu, aby umożliwić połączenie z dowolną maszyną. – Kuberchaun

10

Wystarczy dodać inną opcję - używam Node-DBI podłączyć do PG, ale również ze względu na możliwość porozmawiania z MySQL i sqlite. Node-DBI zawiera również funkcję do budowania instrukcji select, która jest przydatna do robienia dynamicznych rzeczy w locie.

Szybkie próbki (config informacje przechowywane w innym pliku):

var DBWrapper = require('node-dbi').DBWrapper; 
var config = require('./config'); 

var dbConnectionConfig = { host:config.db.host, user:config.db.username, password:config.db.password, database:config.db.database }; 
var dbWrapper = new DBWrapper('pg', dbConnectionConfig); 
dbWrapper.connect(); 
dbWrapper.fetchAll(sql_query, null, function (err, result) { 
    if (!err) { 
    console.log("Data came back from the DB."); 
    } else { 
    console.log("DB returned an error: %s", err); 
    } 

    dbWrapper.close(function (close_err) { 
    if (close_err) { 
     console.log("Error while disconnecting: %s", close_err); 
    } 
    }); 
}); 

config.js:

var config = { 
    db:{ 
    host:"plop", 
    database:"musicbrainz", 
    username:"musicbrainz", 
    password:"musicbrainz" 
    }, 
} 
module.exports = config; 
+0

Hej, mlaccetti, mam podobny problem, próbując połączyć się i uruchomić testy z bazą danych SQLite3. Przechodzę samouczek z instrukcjami korzystania z DBWrapper, dlatego właśnie docieram do Ciebie. Moje pytanie jest tutaj: http://stackoverflow.com/q/35803874/1735836 – Patricia

+0

Węzeł Node-DBI został od dawna porzucony i nie jest już obsługiwany. –

18

Proste podejście: pg-promise, jeśli jesteś zaznajomiony z obietnicami, że jest;)

var pgp = require('pg-promise')(/*options*/); 

var cn = { 
    host: 'localhost', // server name or IP address; 
    port: 5432, 
    database: 'myDatabase', 
    user: 'myUser', 
    password: 'myPassword' 
}; 
// alternative: 
// var cn = 'postgres://username:[email protected]:port/database'; 

var db = pgp(cn); // database instance; 

// select and return user name from id: 
db.one('SELECT name FROM users WHERE id = $1', 123) 
    .then(user => { 
     console.log(user.name); // print user name; 
    }) 
    .catch(error => { 
     console.log(error); // print the error; 
    }); 

Zobacz również: How to correctly declare your database module.

+0

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podać link do odniesienia. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. – arulmr

+1

W idealnym świecie - tak, a jednak akceptowana tutaj odpowiedź, jak widać powyżej - tylko link. Tak samo jak tam, byłoby zbyt wielkim zbytnim streszczaniem informacji zawartych w linku, a biorąc pod uwagę, że oba łącza są udostępniane repozytoriom publicznym GitHub, szanse na to, że zginą, to nie więcej niż szansa, że ​​StackOverflow pójdzie martwy . –

+0

Może wystarczy podać prosty przykład użycia go do czegoś bardzo podstawowego, które powinno zająć tylko kilka linii, ale wystarczyłoby, aby nie było tylko linkiem. –

1

Jednym z rozwiązań może być za pomocą pool klientów jak następuje:

const pg = require('pg'); 
var config = { 
    user: 'foo', 
    database: 'my_db', 
    password: 'secret', 
    host: 'localhost', 
    port: 5432, 
    max: 10, // max number of clients in the pool 
    idleTimeoutMillis: 30000 
}; 

pool.on('error', function (err, client) { 
    console.error('idle client error', err.message, err.stack); 
}); 
pool.query('SELECT $1::int AS number', ['2'], function(err, res) { 
    if(err) { 
     return console.error('error running query', err); 
    } 
    console.log('number:', res.rows[0].number); 
}); 

można zobaczyć więcej szczegółów na this resource.

Powiązane problemy