নোড.জেএস এর মাধ্যমে পোস্টগ্রিসের সাথে কীভাবে সংযোগ স্থাপন করা যায়


123

আমি নিজেকে পোস্টগ্রিস ডাটাবেস তৈরি করার চেষ্টা করছি বলে আমি পোস্টগ্রাগুলি ইনস্টল করেছি এবং এর সাথে একটি সার্ভার initdb /usr/local/pgsql/dataশুরু করেছি, তারপরে আমি postgres -D /usr/local/pgsql/dataএখনই উদাহরণটি শুরু করেছি কীভাবে আমি নোডের মাধ্যমে এইটির সাথে ইন্টারেক্ট করতে পারি? উদাহরণস্বরূপ, কী হবে connectionstringবা আমি কীভাবে এটি সন্ধান করতে সক্ষম।

উত্তর:


313

এখানে আমার পোস্টগ্রিজ ডাটাবেসের সাথে নোড.জেএস সংযোগ করার জন্য ব্যবহৃত একটি উদাহরণ।

আমি যে নোড.জেএস-এর ইন্টারফেসটি ব্যবহার করেছি তা এখানে পাওয়া যাবে https://github.com/brianc/node-postgres

var pg = require('pg');
var conString = "postgres://YourUserName:YourPassword@localhost: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();
});

আপডেট: - query.onফাংশনটি এখন অবচয় করা হয়েছে এবং তাই উপরের কোডটি ইচ্ছাকৃতভাবে কাজ করবে না। এই চেহারাটির সমাধান হিসাবে: - ক্যোয়ার.অন কোনও ফাংশন নয়


24
এখন আমি যে ধরণের উদাহরণটি দেখতে চাই তা পছন্দ করে। পরিষ্কার এবং কেবল পর্যাপ্ত কোড সহ অন্তর্ভুক্ত। ধন্যবাদ জাস্টবো।
স্ট্রাডাস

1
নোড.জেএস থেকে সংযোগের জন্য আপনি নিজের pg_hba.conf এ কী যুক্ত করেছেন? ধন্যবাদ
মারিয়াস

3
সমস্ত হোস্ট 0.0.0.0/0 md5 এই এন্ট্রিটি যদি আমি মনে করি সঠিকভাবে কোনও আইপি সংযোগ করতে দেয়। মনে রাখবেন এটি নোড নির্দিষ্ট নয়, তবে পোস্টগ্রিএসকিউএল নির্দিষ্ট। এছাড়াও পোস্টগ্র্যাসক্লি.এল.এফ.এতে আমার শ্রুতি_প্রেমী = '*' রয়েছে। উত্পাদন সেটআপগুলির জন্য দয়া করে ডকসটি পড়ুন যাতে আপনি কোথাও কোথাও গর্ত না খোলেন তা নিশ্চিত করুন। আমি এটি আমার ডেভ সেটআপে ব্যবহার করি সুতরাং যে কোনও মেশিনকে সংযুক্ত হওয়ার অনুমতি দিতে আমি ভাল আছি।
কুবেরচাঁন

1
বানানো কনস্ট্রিং প্যারামিটারগুলি প্রতিভা, এবং ঠিক আমি যা খুঁজছিলাম। ধন্যবাদ!
নেলসোনেনজো


33

একটি আধুনিক এবং সাধারণ পদ্ধতির: পিজি-প্রতিশ্রুতি :

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

const cn = {
    host: 'localhost', // server name or IP address;
    port: 5432,
    database: 'myDatabase',
    user: 'myUser',
    password: 'myPassword'
};

// alternative:
// var cn = 'postgres://username:password@host:port/database';

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

// select and return a single 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;
    });

// alternative - new ES7 syntax with 'await':
// await db.one('SELECT name FROM users WHERE id = $1', [123]);

আরও দেখুন: কীভাবে আপনার ডাটাবেস মডিউলটি সঠিকভাবে ঘোষণা করবেন


যদিও এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, উত্তরের প্রয়োজনীয় অংশগুলি এখানে অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্কটি সরবরাহ করা ভাল। লিঙ্কযুক্ত পৃষ্ঠাগুলি পরিবর্তিত হলে লিঙ্ক-শুধুমাত্র উত্তরগুলি অবৈধ হতে পারে।
arulmr

1
একটি আদর্শ বিশ্বে - হ্যাঁ, এবং এখনও, গ্রহণযোগ্য উত্তরগুলি যেমন আপনি উপরে দেখতে পারেন - কেবল লিঙ্কটিও। সেখানে একইভাবে, লিঙ্কটি সরবরাহ করে এমন তথ্য থেকে বিমূর্ততা তৈরি করা খুব বেশি হবে এবং উভয় লিঙ্কগুলি গিথহাবের পাবলিক রিপোজিস্টরিগুলিতে দেওয়া হয়েছে তা বিবেচনা করে, তাদের মৃত হওয়ার সম্ভাবনা স্ট্যাকওভারফ্লো মারা যাওয়ার সম্ভাবনার চেয়ে বেশি নয় are ।
প্রাণবন্ত- t

সম্ভবত এটি খুব বেসিক কোনও কিছুর জন্য ব্যবহারের একটি সহজ উদাহরণ সরবরাহ করুন, এটি কেবল কয়েকটি লাইন গ্রহণ করা উচিত তবে এটি কেবলমাত্র লিংক না তৈরি করার জন্য যথেষ্ট।
কোয়ান্টাস 94 ভারী

@ কোয়ান্টাস ৯৪ হাই, এবং আমি ঠিক করেছি, ডাউন-ভোটিংয়ের জন্য এটি আটকে
রেখেছি

@ প্রাণবন্ত-টি: কেউ সম্ভবত পোস্টটিকে "খুব নিম্ন মানের" হিসাবে চিহ্নিত করেছেন, যা পতাকা সম্পাদনা করার আগে পোস্ট সম্পাদনা করা বা মুছে ফেলা হলে একটি স্বয়ংক্রিয় ডাউনভোট দেয়।
কোয়ান্টাস 94 ভারী

12

কেবল একটি ভিন্ন বিকল্প যুক্ত করতে - আমি নোড-ডিবিআই ব্যবহার করি সাথে সংযোগ করতে , তবে মাইএসকিউএল এবং স্ক্লাইটে কথা বলার দক্ষতার কারণেও। নোড-ডিবিআইতে একটি নির্বাচনী বিবৃতি তৈরিতে কার্যকারিতাও অন্তর্ভুক্ত রয়েছে, যা উড়তে ডায়নামিক স্টাফ করার জন্য কার্যকর।

দ্রুত নমুনা (অন্য ফাইলে সঞ্চিত কনফিগারেশন তথ্য ব্যবহার করে):

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;

হেই, ম্যালাক্যাস্তি, আমার এসকিউএলাইট 3 ডাটাবেসটির বিরুদ্ধে সংযোগ স্থাপন এবং পরীক্ষা চালানোর চেষ্টা করার মতো একই সমস্যা রয়েছে issue আমি একটি টিউটোরিয়াল দিয়ে যাচ্ছি DBWrapper ব্যবহারের নির্দেশাবলী সহ, তাই আমি আপনার কাছে পৌঁছে যাচ্ছি। আমার প্রশ্ন এখানে: stackoverflow.com/q/35803874/1735836
প্যাট্রিসিয়া

নোড-ডিবিআই দীর্ঘকাল পরিত্যক্ত ছিল, এবং আর সমর্থন করে না।
প্রাণবন্ত- t

2

একটি সমাধান poolনিম্নলিখিত ক্লায়েন্টদের ব্যবহার করা যেতে পারে :

const { Pool } = 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
};
const pool = new Pool(config);
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);
});

আপনি এই সংস্থানটিতে আরও বিশদ দেখতে পারেন ।


আপনি 'কনফিগার' ব্যবহার করেন নি।
লেবুউল অ্যাডানে

1

স্লোনিক হ'ল কুবেরচাঁই এবং ভাইটালির প্রস্তাবিত উত্তরের বিকল্প।

স্লোনিক নিরাপদ সংযোগ হ্যান্ডলিং প্রয়োগ করে ; আপনি একটি সংযোগ পুল তৈরি করেন এবং সংযোগ খোলার / হ্যান্ডলিং আপনার জন্য পরিচালিত হয়।

import {
  createPool,
  sql
} from 'slonik';

const pool = createPool('postgres://user:password@host:port/database');

return pool.connect((connection) => {
  // You are now connected to the database.
  return connection.query(sql`SELECT foo()`);
})
  .then(() => {
    // You are no longer connected to the database.
  });

postgres://user:password@host:port/database আপনার সংযোগের স্ট্রিং (বা আরও সাধারণভাবে সংযোগ ইউআরআই বা ডিএসএন)।

এই পদ্ধতির সুবিধা হ'ল আপনার স্ক্রিপ্টটি নিশ্চিত করে যে আপনি কখনও দুর্ঘটনাক্রমে ঝুলন্ত সংযোগগুলি ত্যাগ করবেন না।

স্লোনিক ব্যবহারের অন্যান্য সুবিধার মধ্যে রয়েছে:


0

আমরা পোস্টগ্র্যাক্সেল-সহজও ব্যবহার করতে পারি । এটি নোড- পোস্টগ্র্রেস এবং স্ক্লুটিলিতে নির্মিতদ্রষ্টব্য: pg_connection.js এবং your_handler.js একই ফোল্ডারে। db.js স্থাপন করা কনফিগার ফোল্ডারে রয়েছে।

pg_connection.js

const PgConnection = require('postgresql-easy');
const dbConfig = require('./config/db');
const pg = new PgConnection(dbConfig);
module.exports = pg;

./config/db.js

module.exports =  {
  database: 'your db',
  host: 'your host',
  port: 'your port',
  user: 'your user',
  password: 'your pwd',
}

your_handler.js

  const pg_conctn = require('./pg_connection');

  pg_conctn.getAll('your table')
    .then(res => {
         doResponseHandlingstuff();
      })
    .catch(e => {
         doErrorHandlingStuff()     
      })
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.