از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
افزودن پایگاه داده PostgreSQL به برنامه Node.js روی HerokuHeroku یک سرویس میزبانی است که از برنامه های Node.js پشتیبانی می کند. استفاده از آن آسان است و عملکرد آن را می توان با افزونه ها افزایش داد. افزونههایی برای چیزهای مختلف، از جمله پیامرسانی/صفها، ورود به سیستم، معیارها و البته ذخیرهسازی دادهها وجود دارد. افزونه های فروشگاه داده از پایگاه داده های محبوب مانند PostgreSQL، Redis و … پشتیبانی می کنند.
سرفصلهای مطلب
معرفی
Heroku یک سرویس میزبانی است که از برنامه های Node.js پشتیبانی می کند. استفاده از آن آسان است و می توان عملکرد آن را افزایش داد افزونه ها. افزونههایی برای چیزهای مختلف، از جمله پیامرسانی/صفها، ورود به سیستم، معیارها و البته ذخیرهسازی دادهها وجود دارد. افزونه های فروشگاه داده از پایگاه داده های محبوب مانند PostgreSQL، Redis و DynamoDB پشتیبانی می کنند.
در این آموزش ما یک پایگاه داده PostgreSQL را به یک برنامه Node اضافه می کنیم که URL ها را کوتاه می کند. سپس برنامه را در Heroku مستقر می کنیم و افزودنی PostgreSQL را راه اندازی می کنیم.روی.
PostgreSQL
اگر قبلاً آن را ندارید، باید Postgres را نصب کنید روی ماشین شما بسته به روش های مختلفی برای نصب آن وجود دارد روی سیستم عامل شما بازدید کنید دانلودهای PostgreSQL page برای اطلاعات بیشتر.
با نصب PostgreSQL، میتوانیم یک پایگاه داده برای استفاده از برنامه کوتاهکننده URL ایجاد کنیم:
$ psql
psql (11.6)
Type "help" for help.
tomkadwill=#
و سپس استفاده کنید CREATE DATABASE
دستور SQL:
tomkadwill=# CREATE DATABASE urlshortener_development;
CREATE DATABASE
tomkadwill=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
--------------------------+------------+----------+-------------+-------------+-----------------------
urlshortener_development | tomkadwill | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
در اینجا یک پایگاه داده به نام ایجاد می کنیم urlshortener_development
و سپس استفاده کنید \l
به print لیستی از تمام پایگاه های داده PostgreSQL در سیستم.
پایگاه داده جدید ما urlshortener_development
وجود دارد تا بدانیم با موفقیت ایجاد شد. همچنین به مالک پایگاه داده توجه کنید زیرا بعداً به آن نیاز خواهیم داشت روی (مال شما با من متفاوت خواهد بود).
ادغام Postgres در برنامه Node
برنامه Node که ما کار خواهیم کرد روی نسبتا ساده است اگر میخواهید آن را از ابتدا بسازید، میتوانید راهنمای ما، استقرار یک برنامه Node.js در Heroku را دنبال کنید، یا میتوانید آن را از آن دانلود کنید. GitHub.
منطق برنامه Express همه در داخل است app.js
:
const express = require('express');
const app = express();
const path = require('path');
const port = process.env.PORT || 3000;
const urlShortener = require('node-url-shortener');
const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({extended: true}));
app.use(express.urlencoded());
app.get('/', function(req, res) {
res.sendFile(path.join(__dirname + '/index.html'));
});
app.post('/url', function(req, res) {
const url = req.body.url
urlShortener.short(url, function(err, shortUrl){
res.send(shortUrl);
});
});
app.listen(port, () => console.log(`url-shortener listening روی port ${port}!`));
می توانید برنامه را از طریق اجرا کنید npm start
. پس از شروع، مرور به localhost: 3000 و شما باید ببینید homepage:
برنامه به روز رسانی است app.js
به طوری که هر URL و URL کوتاه شده را در جدول DB ذخیره می کند و سپس 5 نتیجه آخر را نمایش می دهد روی UI
اولین کاری که باید انجام دهیم نصب an ORM کتابخانه (Object Relation Mapper). تعامل مستقیم با PostgreSQL دشوار است زیرا ما باید درخواست های SQL خام خود را بنویسیم.
یک ORM به ما اجازه می دهد تا از طریق فراخوانی های ساده تر API با پایگاه داده تعامل داشته باشیم. توجه داشته باشید که استفاده از ORM ها جنبه های منفی دارد، اما در این آموزش به آنها نمی پردازم.
تعدادی کتابخانه ORM مختلف برای Node وجود دارد، در این مورد ما از آنها استفاده خواهیم کرد عاقبت سازی:
$ npm install --save sequelize
$ npm install --save pg pg-hstore
اولین دستور نصب می شود عاقبت سازی و دومی درایور PostgreSQL را برای Node نصب می کند. Sequelize از چندین پایگاه داده پشتیبانی می کند، بنابراین باید مشخص کنیم که از کدام یک استفاده کنیم و درایور Node را ارائه دهیم.
مهاجرت ها
با نصب و پیکربندی Sequelize، می توانیم به ساختار پایگاه داده فکر کنیم. ما فقط به چیزی ساده نیاز داریم، یک جدول با 3 ستون: یک شناسه منحصر به فرد، URL اصلی و URL کوتاه شده.
میتوانیم جدول پایگاه داده جدید را به صورت دستی ایجاد کنیم، اما این کار استقرار را دردناک میکند. ما باید پرس و جوهای خود را به خاطر بسپاریم و آنها را اجرا کنیم روی هر محیط
یک راه بهتر برای مدیریت تغییرات پایگاه داده از طریق مهاجرت است، جایی که تغییرات پایگاه داده در داخل برنامه کدگذاری می شود. خوشبختانه، Sequelize از مهاجرت های خارج از جعبه پشتیبانی می کند. بیایید یک مهاجرت بنویسیم تا جدولی برای URL ها ایجاد کنیم.
ابتدا، Sequelize CLI را نصب می کنیم که به ما امکان می دهد مهاجرت ها را اجرا کنیم:
$ npm install --save sequelize-cli
سپس Sequelize را مقداردهی اولیه می کنیم:
$ npx sequelize-cli init
این یک ایجاد خواهد کرد config/config.json
فایل و models
، migrations
، و seeders
دایرکتوری ها
پس از آن، ما باید آن را اصلاح کنیم config.json
فایل به طوری که بتواند به پایگاه داده PostgreSQL ما متصل شود:
{
"development": {
"username": "tomkadwill",
"password": "password",
"database": "urlshortener_development",
"host": "localhost",
"dialect": "postgres",
"operatorsAliases": false
}
}
پس از اتمام فایل، اجازه دهید مهاجرت را با استفاده از Sequelize CLI ایجاد کنیم. در اینجا، فیلدهای خود را از طریق تعریف می کنیم attributes
پرچم. ما شامل آن نخواهیم شد id
از آنجایی که به صورت خودکار اضافه می شود:
$ npx sequelize-cli model:generate --name Url --attributes url:string,shortUrl:string
این یک فایل مهاجرت ایجاد می کند که چیزی شبیه به این است:
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('Urls', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
url: {
type: Sequelize.STRING
},
shortUrl: {
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('Urls');
}
};
مهاجرت ها حاوی یک up
و down
تابع. up
برای جلو بردن پایگاه داده استفاده می شود و down
برای عقب رفتن استفاده می شود.
در این مورد up
الف را ایجاد می کند Urls
جدولی که 5 فیلد دارد. آن را دارد url
و shortUrl
زمینه ها و همچنین id
، createdAt
، و updatedAt
، که به طور پیش فرض اضافه می شوند.
این down
مهاجرت به سادگی حذف خواهد شد Urls
جدول.
در نهایت، بیایید مهاجرت را اجرا کنیم:
$ npx sequelize-cli db:migrate
پس از اجرای آن، میتوانیم مستقیماً از پایگاه داده پرس و جو کنیم تا بررسی کنیم که همه چیز کار میکند:
$ psql -p 5432 "urlshortener_development"
psql (11.6)
Type "help" for help.
urlshortener_development=# \dt
List of relations
Schema | Name | Type | Owner
--------+---------------+-------+------------
public | SequelizeMeta | table | tomkadwill
public | Urls | table | tomkadwill
(2 rows)
urlshortener_development=# \d "Urls"
Table "public.Urls"
Column | Type | Collation | Nullable | Default
-----------+--------------------------+-----------+----------+------------------------------------
id | integer | | not null | nextval('"Urls_id_seq"'::regclass)
url | character varying(255) | | |
shortUrl | character varying(255) | | |
createdAt | timestamp with time zone | | not null |
updatedAt | timestamp with time zone | | not null |
Indexes:
"Urls_pkey" PRIMARY KEY, btree (id)
همانطور که می بینید دو جدول پایگاه داده وجود دارد: SequelizeMeta
و Urls
. و اگر بازرسی کنیم Urls
، زمینه های مورد انتظار وجود دارد.
ذخیره URL ها
اکنون که PostgreSQL را پیکربندی کرده ایم و یک جدول پایگاه داده با ساختار صحیح ایجاد کرده ایم، گام بعدی این است که برنامه خود را به روز کنیم تا URL های پایگاه داده را حفظ کند. به یاد بیاورید که npx sequelize-cli model:generate
یک فایل مدل ایجاد کردیم، از آن برای ذخیره URL ها در پایگاه داده استفاده خواهیم کرد.
ابتدا ما نیاز داریم import مدل ها به app.js
، با نیاز models/index.js
:
const db = require('./models/index.js');
این models/index.js
فایل توسط Sequelize تولید شده است و هدف آن شامل تمام فایل های مدل است.
بعد، ما باید به روز رسانی کنیم post
مسیر به طوری که یک رکورد پایگاه داده ایجاد می کند. ما می توانیم استفاده کنیم findOrCreate()
تابع به طوری که هر URL فقط یک ورودی پایگاه داده منحصر به فرد دارد:
app.post('/url', function(req, res) {
const url = req.body.url
urlShortener.short(url, function(err, shortUrl) {
db.Url.findOrCreate({where: {url: url, shortUrl: shortUrl}})
.then(((urlObj, created)) => {
res.send(shortUrl)
});
});
});
چه زمانی db.Url.findOrCreate()
نامیده می شود، سعی می کند رکوردی را پیدا کند که با ارائه شده توسط کاربر مطابقت داشته باشد url
و تولید شد shortUrl
. اگر یکی پیدا شود، Sequelize هیچ کاری انجام نمی دهد، در غیر این صورت، یک رکورد جدید ایجاد می کند.
نمایش URL ها در رابط کاربری
برای کاربرپسندی، بیایید برنامه را بهروزرسانی کنیم تا 5 نشانی اینترنتی باقیمانده را نمایش دهد.
برای این منظور، ما یک موتور قالب اضافه می کنیم تا Express بتواند URL ها را به صورت پویا ارائه کند. موتورهای قالب زیادی در دسترس هستند اما در این مورد ما از آنها استفاده خواهیم کرد دسته اکسپرس:
$ npm install --save express-handlebars
پس از نصب بسته می توانیم آن را به آن اضافه کنیم app.js
:
const exphbs = require('express-handlebars');
app.engine('handlebars', exphbs());
app.set('view engine', 'handlebars');
در مرحله بعد، باید ساختار دایرکتوری برنامه را تغییر دهیم. express-handlebars
فرض می کند که نماها در a قرار دارند views
فهرست راهنما. همچنین فرض می کند که ما یک views/layouts/main.handlebars
فایل:
.
├── app.js
└── views
├── index.handlebars
└── layouts
└── main.handlebars
بنابراین، بیایید حرکت کنیم و نام آن را تغییر دهیم index.html
فایل:
$ mv index.html views/index.handlebars
و در نهایت بیایید یک فایل طرح بندی بسازیم، views/layouts/main.handlebars
:
<html>
<head>
<title>Url Shortener</title>
</head>
<body>
{{{body}}}
</body>
</html>
ترتیب خاصی وجود دارد که فایل های قالب بارگیری می شوند: express-handlebars
ارائه خواهد کرد views/layouts/main.handlebars
که سپس رندر می کند views/index.handlebars
درون {{{body}}}
برچسب زدن
حالا که ساختار دایرکتوری درستی داریم، اجازه دهید مقداری کد HTML به آن اضافه کنیم index.handlebars
برای نمایش پویا URL ها:
<ul>
{{#each urlObjs}}
<li>{{this.url}} -- <b>{{this.shortUrl}}</b></li>
{{/each}}
</ul>
در اینجا ما از Handlebars استفاده می کنیم each
کمک کننده برای تکرار روی هر شی URL و نمایش URL اصلی و URL کوتاه.
آخرین کاری که باید انجام دهیم، به روز رسانی است GET
مسیر در app.js
برای ارسال URL ها به view:
app.get('/', function(req, res) {
db.Url.findAll({order: (('createdAt', 'DESC')), limit: 5})
.then(urlObjs => {
res.render('index', {
urlObjs: urlObjs
});
});
});
بیایید از آنچه در اینجا اتفاق می افتد عبور کنیم. چه زمانی /
درخواست شده است، Sequelize پرس و جو می کند Urls
جدول. پرس و جو توسط createdAt
و محدود به 5 است که تضمین می کند فقط 5 نتیجه اخیر برگردانده می شوند.
نتیجه پرس و جو به آن منتقل می شود res.render
به عنوان متغیر محلی urlObjs
، که توسط الگو استفاده خواهد شد.
ارائه شده page به نظر می رسد این است:
اگر مشکلی دارید، می توانید کد تکمیل شده را از اینجا دانلود کنید GitHub.
استقرار برنامه در Heroku
اکنون که برنامه به صورت محلی اجرا می شود، این بخش روش اجرای آن را توضیح می دهد روی Heroku و روش اتصال پایگاه داده به آن پس از اجرا.
ابتدا، بیایید همه تغییرات خود را در Heroku پیاده سازی کنیم:
$ git push heroku master
برای راهنمای دقیق به استقرار یک برنامه Node.js در Heroku مراجعه کنید روی اعزام به هروکو
اتصال پایگاه داده
افزودن پایگاه داده کار سختی نیست و تنها چیزی که نیاز دارد یک خط فرمان است:
$ heroku addons:create heroku-postgresql:hobby-dev
این دستور افزونه PostgreSQL را ایجاد می کند.روی برای Heroku و یک متغیر محیطی به نام تنظیم می کند DATABASE_URL
– فقط باید به Sequelize بگوییم که با به روز رسانی فایل پیکربندی از آن استفاده کند:
{
"development": {
"username": "tomkadwill",
"password": "password",
"database": "urlshortener_development",
"host": "localhost",
"dialect": "postgres",
"operatorsAliases": false
},
"production": {
"username": "tomkadwill",
"password": "password",
"database": "urlshortener_production",
"host": "localhost",
"dialect": "postgres",
"operatorsAliases": false,
"use_env_variable": "DATABASE_URL"
}
}
در اینجا ما یک بخش پیکربندی جدید برای تولید اضافه کردهایم، به جز نام پایگاه داده و use_env_variable
رشته.
موارد استفاده را دنبال کنید use_env_variable
برای واکشی نام متغیر محیطی برای استفاده برای اتصال به پایگاه داده.
هیروکو دارد NODE_ENV
به طور پیش فرض روی “production” تنظیم کنید، به این معنی که به دنبال تنظیمات تولید می شود. بیایید متعهد شویم و به هروکو فشار بیاوریم.
در مرحله بعد، باید مهاجرت ها را اجرا کنیم روی استفاده از هیروکو sequelize db:migrate
:
$ heroku run bash
Running bash روی ⬢ nameful-wolf-12818... up, run.5074 (Free)
~ $ sequelize db:migrate
اگر قبلاً مهاجرت را ایجاد نکردهایم، اکنون اسکریپتها را به صورت دستی اجرا میکنیم.
در این مرحله، برنامه باید در مرورگر کار کند.
مدیریت پایگاه داده Heroku
احتمالاً در برخی مواقع نیاز خواهید داشت که پایگاه داده تولید خود را پرس و جو یا اصلاح کنید. برای مثال، ممکن است لازم باشد برخی از داده ها را برای کمک به تشخیص یک اشکال پرس و جو کنید یا ممکن است لازم باشد برخی از داده های کاربر را تغییر دهید. بیایید ببینیم چگونه این کار را انجام دهیم.
اجرای Sequelize Migration Tasks
اولین چیزی که باید بدانید این است که چگونه Sequelize migrations را اجرا کنید روی هیروکو. روش مشاهده لیستی از دستورات موجود به این صورت است:
$ heroku run bash
Running bash روی ⬢ nameful-wolf-12818... up, run.1435 (Free)
~ $ sequelize
اینها برخی از مفیدترین آنها هستند:
sequelize db:migrate:undo
: بازگشت یک مهاجرت واحدsequelize db:migrate:undo:all
: همه مهاجرت ها را برگردانید. به طور موثر به یک پایگاه داده تمیز برگردیدsequelize db:migrate:status
: بررسی کنید که برنامه شما کدام مهاجرت است روی
استفاده از Sequelize Models در کنسول
علاوه بر وظایف CLI، میتوانیم از مدلهای Sequelize مستقیماً در Node استفاده کنیم console:
$ heroku run bash
~ $ node
Welcome to Node.js v12.14.0.
Type ".help" for more information.
>
در اینجا چند نمونه کد قابل اجرا در Node آورده شده است console. ممکن است متوجه شوید که آنها شبیه Node REPL هستند.
پرس و جو برای یک URL فردی با شناسه:
db.Url.findByPk(1).then(url => {
console.log(
url.get({plain: true})
);
});
درخواست برای همه آدرسهای اینترنتی:
db.Url.findAll().then(urls => {
urls.map(url => {
console.log(
url.get({plain: true})
);
});
});
درج رکورد URL:
db.Url.create({url: 'https://rasanegar.com/deploying-a-node-js-app-to-heroku', shortUrl: 'https://is.gd/56bEH3'});
پرس و جو برای یک URL با شناسه و به روز رسانی آن:
db.Url.findByPk(1).then(url => {
url.shortUrl = 'example.com';
url.save();
});
پرس و جو برای یک URL با شناسه و حذف آن:
db.Url.findByPk(1).then(url => {
url.destroy();
});
نتیجه
افزونه های متعددی وجود دارد که می توان از آنها برای گسترش Heroku استفاده کرد. یکی از این افزونه ها Heroku Postgres است که به شما امکان می دهد به راحتی یک پایگاه داده برای ذخیره داده های برنامه راه اندازی کنید.
ما یک برنامه ساده Node و Express را گسترش داده ایم تا url ها را در پایگاه داده Postgres ذخیره کند. روی هیروکو.
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1403-01-22 05:52:04