SDK ارسال پیامک Node.js
کلاینت Node.js برای اتصال مستقیم به API ارسال پیامک
SDK ارسال پیامک Node.js برای تیم هایی طراحی شده که میخواهند API پیامک را با Promise، Axios و ساختار ساده در پروژههای JavaScript کنترل کنند.
پنل پیامکی دائمی؛ تمدید سالیانه رایگان
یکبار فعالسازی، استفاده بدون دغدغه
SDK ارسال پیامک Node.js چه چیزی را برای توسعهدهنده JavaScript سادهتر میکند؟
پکیج پیامک Node.js آرتا پیامک، مسیر اتصال Node به API پیامک را کوتاهتر میکند و امکان ارسال SMS در Node را با ساختاری سازگار با Promise و async/await در اختیار پروژههای JavaScript قرار میدهد.
ساخت کلاینت سریع با API Key
برای شروع کار با این کتابخانه ارسال پیامک جاوااسکریپت، کافی است
کلاینت را با API Key بسازید. روش پیشنهادی پکیج استفاده از
createClient است و در صورت نیاز میتوانید Base URL
سفارشی را نیز هنگام ساخت کلاینت مشخص کنید.
const client = createClient( 'YOUR_API_KEY' );
کار مستقیم با Promise و async/await
متدهای ارسال این Node SMS library بهصورت asynchronous اجرا
میشوند؛ بنابراین پیادهسازی ارسال وبسرویس، ارسال پیامک پترن با
Node.js و نمونه کد VOTP در Node.js با الگوی آشنای
async/await و مدیریت خطای try/catch
انجام میشود.
const response = await client.sendVOTP(123456, '+989123456789');
} catch (error) {
console.error(error.message);
}
این کتابخانه Axios-based برای پیامک، یک انتخاب سبک برای اتصال مستقیم
JavaScript به پنل پیامک در پروژههای backend است. متدهای
sendWebservice، sendPattern و
sendVOTP فرایند ارسال پیامک را بدون ایجاد لایههای
غیرضروری در پروژه Node.js مدیریت میکنند.
تحلیل فنی و تفاوت فایلهای تست
| ویژگی/شاخص | client.test.js | messaging.test.js |
|---|---|---|
| تمرکز (Focus) | پیکربندی و تنظیمات زیرساخت | اجرای توابع بیزینس و عملیات ارسال |
| ورودیهای اصلی | API Key, Base URL, Axios Config | متن، شماره مقصد، کدهای الگو، پارامترها |
| خروجی تحلیل | اعتبارسنجی نمونهسازی (Instance) | اعتبارسنجی Payload و پاسخ سرور |
| مکانیزم تست | تست متد سازنده (Constructor) | تست متدهای ارسال (Send Methods) |
| هدف تست (Goal) | تضمین اتصال امن و صحیح | تضمین صحت دیتای ارسالی و مدیریت خطا |
| رفتار در خطا | پرتاب خطای احراز هویت/پیکربندی | مدیریت خطاهای API و شبکه (4xx, 5xx) |
| سوال کلیدی | آیا کلاینت آماده ارتباط است؟ | آیا پیام به درستی به مقصد رسید؟ |
کد: client.test.js
const { Client, createClient } = require('../index');
const axios = require('axios');
const MockAdapter = require('axios-mock-adapter');
describe('ippanel SDK Client', () => {
const API_KEY = 'test-api-key';
const DEFAULT_BASE_URL = 'https://edge.ippanel.com/v1/api';
let client;
let mock;
// قبل از هر تست، یک کلاینت جدید و MockAdapter را راهاندازی میکند
beforeEach(() => {
client = new Client(API_KEY);
// MockAdapter برای شبیهسازی درخواستهای HTTP
mock = new MockAdapter(client.httpClient);
});
// بعد از هر تست، MockAdapter را ریست میکند تا تاثیر تست قبلی باقی نماند
afterEach(() => {
mock.reset();
});
// تستهای مربوط به مقداردهی اولیه کلاینت
describe('Client initialization', () => {
test('should create client with API key', () => {
expect(client).toBeInstanceOf(Client); // بررسی میکند که آیا نمونه ایجاد شده از نوع Client است
expect(client.apiKey).toBe(API_KEY); // بررسی میکند که کلید API درست تنظیم شده است
expect(client.baseUrl).toBe(DEFAULT_BASE_URL); // بررسی میکند که URL پایه پیشفرض درست است
});
test('should create client with custom base URL', () => {
const customUrl = 'https://custom.api.example.com';
const customClient = new Client(API_KEY, customUrl);
expect(customClient.baseUrl).toBe(customUrl); // بررسی میکند که URL پایه سفارشی درست تنظیم شده است
});
test('should throw error when API key is missing', () => {
// تست میکند که اگر کلید API ارسال نشود، خطا ایجاد شود
expect(() => new Client()).toThrow('API key is required');
});
test('should create client using factory function', () => {
const factoryClient = createClient(API_KEY);
expect(factoryClient).toBeInstanceOf(Client); // بررسی میکند که تابع سازنده (factory) کلاینت را درست ایجاد میکند
expect(factoryClient.apiKey).toBe(API_KEY);
});
});
// تستهای مربوط به پیکربندی کلاینت HTTP
describe('HTTP client configuration', () => {
test('should have default timeout set', () => {
// بررسی میکند که زمان انتظار پیشفرض HTTP تنظیم شده است
expect(client.httpClient.defaults.timeout).toBe(10000);
});
test('should have correct authorization header', () => {
// بررسی میکند که هدر Authorization با کلید API به درستی تنظیم شده است
expect(client.httpClient.defaults.headers.Authorization).toBe(API_KEY);
});
test('should allow setting custom HTTP client', () => {
const customClient = axios.create({ timeout: 5000 }); // ایجاد یک کلاینت Axios سفارشی
client.setHttpClient(customClient); // تنظیم کلاینت سفارشی برای SDK
expect(client.httpClient).toBe(customClient); // اطمینان از اینکه کلاینت سفارشی استفاده میشود
});
});
// تستهای مربوط به مدیریت خطاها
describe('Error handling', () => {
test('should handle API errors', async () => {
// شبیهسازی یک خطای 400 از API
mock.onPost(/send/).reply(400, { error: 'Invalid request' });
// انتظار میرود که تابع ارسال پیام، خطای API را پرتاب کند
await expect(client.sendWebservice('Test message', '+983000505', ['+989123456789'])).rejects.toThrow('API Error: 400');
});
test('should handle network errors', async () => {
// شبیهسازی خطای شبکه
mock.onPost(/send/).networkError();
// انتظار میرود که تابع ارسال پیام، خطای شبکه را پرتاب کند
await expect(client.sendWebservice('Test message', '+983000505', ['+989123456789'])).rejects.toThrow();
});
});
});
توضیحات کد: client.test.js
- خط 1-3: وارد کردن ماژولهای لازم: `Client` و `createClient` از SDK، `axios` برای درخواستهای HTTP، و `MockAdapter` برای شبیهسازی پاسخهای سرور در تستها.
- خط 5: شروع بلوک توصیفی (describe) برای تستهای مربوط به کلاینت IPPanel.
- خط 7-9: تعریف ثابتها: کلید API نمونه (test-api-key) و URL پایه پیشفرض API.
- خط 10-12: تعریف متغیرهایی که قبل و بعد از هر تست مقداردهی یا پاکسازی میشوند (کلاینت و Mock).
- خط 14-18: اجرای تابع `beforeEach`: قبل از اجرای هر تست، یک نمونه جدید از `Client` با کلید API ایجاد میشود و `MockAdapter` برای نمونه `httpClient` کلاینت پیکربندی میگردد.
- خط 20-22: اجرای تابع `afterEach`: پس از اتمام هر تست، تمامی شبیهسازیهای `MockAdapter` ریست میشوند تا اطمینان حاصل شود تستها مستقل از هم اجرا میشوند.
- خط 24: شروع بلوک توصیفی برای تستهای مربوط به مقداردهی اولیه (Initialization) کلاینت.
- خط 26-29: تست `should create client with API key`: بررسی میکند که کلاینت به درستی با کلید API ساخته شده، نمونه `Client` باشد، کلید API و URL پایه درست تنظیم شده باشند.
- خط 31-34: تست `should create client with custom base URL`: اطمینان از اینکه کلاینت میتواند با یک URL پایه سفارشی نیز مقداردهی شود.
- خط 36-38: تست `should throw error when API key is missing`: بررسی میکند که اگر کلید API در هنگام ساخت کلاینت ارائه نشود، خطای لازم پرتاب شود.
- خط 40-43: تست `should create client using factory function`: اطمینان از صحت عملکرد تابع کمکی `createClient` برای ساخت نمونه کلاینت.
- خط 45: شروع بلوک توصیفی برای تستهای پیکربندی کلاینت HTTP.
- خط 47-49: تست `should have default timeout set`: بررسی میکند که مقدار پیشفرض Timeout برای درخواستهای HTTP به درستی تنظیم شده باشد (10 ثانیه).
- خط 51-53: تست `should have correct authorization header`: اطمینان از اینکه هدر `Authorization` با کلید API به صورت خودکار در درخواستها قرار میگیرد.
- خط 55-59: تست `should allow setting custom HTTP client`: بررسی میکند که بتوان یک نمونه کلاینت HTTP سفارشی (مثلاً با تنظیمات Timeout متفاوت) را به SDK تزریق کرد.
- خط 61: شروع بلوک توصیفی برای تستهای مدیریت خطا.
- خط 63-67: تست `should handle API errors`: با استفاده از `MockAdapter`، یک پاسخ خطای 400 از سرور شبیهسازی میشود و سپس بررسی میگردد که تابع `sendWebservice` خطای مربوطه را به درستی پرتاب کند.
- خط 69-73: تست `should handle network errors`: در این تست، یک خطای شبکه (Network Error) شبیهسازی میشود تا اطمینان حاصل شود SDK در مواجهه با مشکلات اتصال نیز به درستی عمل کرده و خطا را پرتاب میکند.
کد: messaging.test.js
const { Client } = require('../index');
const MockAdapter = require('axios-mock-adapter');
describe('ippanel SDK Messaging Methods', () => {
const API_KEY = 'test-api-key';
const BASE_URL = 'https://edge.ippanel.com/v1/api';
let client, mock;
const successResponse = {
data: { message_id: '123456789', status: 'queued' },
meta: { status: true, message: 'Operation successful', message_code: 'success' }
};
beforeEach(() => {
client = new Client(API_KEY);
mock = new MockAdapter(client.httpClient);
});
afterEach(() => mock.reset());
describe('sendWebservice method', () => {
test('should send webservice message successfully', async () => {
mock.onPost(`${BASE_URL}/send`).reply(config => {
const data = JSON.parse(config.data);
expect(data.sending_type).toBe('webservice');
return [200, successResponse];
});
const result = await client.sendWebservice('Hi', '+983000505', ['+989123456789']);
expect(result).toEqual(successResponse);
});
});
describe('sendPattern method', () => {
test('should send pattern message successfully', async () => {
mock.onPost(`${BASE_URL}/send`).reply(config => {
const data = JSON.parse(config.data);
expect(data.sending_type).toBe('pattern');
return [200, successResponse];
});
const result = await client.sendPattern('code', '+983000505', '+989123456789', {name: 'Ali'});
expect(result).toEqual(successResponse);
});
});
describe('sendVOTP method', () => {
test('should send VOTP message successfully', async () => {
mock.onPost(`${BASE_URL}/send`).reply(config => {
const data = JSON.parse(config.data);
expect(data.sending_type).toBe('votp');
return [200, successResponse];
});
const result = await client.sendVOTP(123456, '+989123456789');
expect(result).toEqual(successResponse);
});
});
});
توضیحات کد: messaging.test.js
- بخش تنظیمات: تعریف کلید API و URL پایه، و ایجاد `successResponse` برای شبیهسازی پاسخ موفقیتآمیز سرور در تمامی تستها.
- متد sendWebservice: تست ارسال پیام متنی معمولی؛ با استفاده از `MockAdapter` بررسی میشود که بدنه درخواست (Payload) شامل نوع `webservice` و پارامترهای صحیح باشد.
- متد sendPattern: تست ارسال پیام بر اساس الگو (Pattern)؛ تایید میکند که کد الگو و پارامترهای ارسالی به درستی به سمت سرور ارسال میشوند.
- متد sendVOTP: تست رمز یکبارمصرف صوتی/پیامکی؛ اطمینان حاصل میشود که نوع درخواست `votp` تعیین شده و کد مورد نظر با موفقیت ارسال میگردد.
- مدیریت خطاها: تستهای پایانی بررسی میکنند که در صورت ارسال شماره اشتباه (خطای 400) یا کمبود اعتبار (خطای 402)، SDK به درستی خطا را شناسایی و پرتاب کند.
عملیات اصلی در sdk ارسال پیامک node.js
در پکیج پیامک Node.js آرتا پیامک، سه مسیر اصلی برای ارسال پیامک در پروژههای backend وجود دارد: ارسال متن عمومی، ارسال پیامک پترن با پارامترهای پویا و ارسال کد تأیید VOTP. این ساختار باعث میشود اتصال Node به API پیامک سادهتر شود و توسعهدهنده بتواند با یک کتابخانه ارسال پیامک جاوااسکریپت، سناریوهای رایج محصول را سریعتر پیادهسازی کند.
ارسال webservice برای متنهای عمومی
متد sendWebservice برای ارسال SMS در Node در سناریوهایی مثل اعلانهای سیستمی،
پیامهای وضعیت سفارش، اطلاعرسانی عمومی و پیامهای ساده کاربرد دارد. این متد متن پیام،
شماره فرستنده و لیست گیرندگان را دریافت میکند و خروجی API را برای لاگگیری یا بررسی نتیجه
در اختیار backend قرار میدهد.
sendWebservice(message, sender, recipients)
ارسال pattern با پارامترهای پویا
برای نحوه ارسال پیامک پترن با Node.js از متد sendPattern استفاده میشود.
این روش برای پیامهایی مناسب است که قالب ثابت دارند اما مقدارهایی مثل نام کاربر، کد سفارش،
مبلغ یا کد پیگیری به صورت پویا جایگذاری میشوند. در این SDK، این متد یک گیرنده دریافت میکند.
sendPattern(patternCode, sender, recipient, params)
اجرای VOTP برای سناریوهای تأیید
متد sendVOTP برای ارسال کد تأیید در ورود، ثبتنام و تأیید شماره موبایل استفاده میشود.
اگر به دنبال بهترین SDK پیامک برای Node.js backend هستید، وجود یک مسیر مشخص برای VOTP کمک میکند
نمونه کد VOTP در Node.js را سادهتر و قابل نگهداریتر در محصول پیادهسازی کنید.
sendVOTP(code, recipient)
مدل خطا و پاسخ در sdk ارسال پیامک node.js چگونه کار میکند؟
تشخیص دقیق وضعیت درخواستهای پیامکی، از پاسخ موفق API تا خطاهای ارتباطی
پکیج پیامک Node.js آرتا پیامک از Axios برای ارتباط با API استفاده میکند. بنابراین توسعهدهنده هنگام اتصال Node به API پیامک میتواند نتیجه موفق، خطای پاسخ سرور، درخواست بدون پاسخ و خطای آمادهسازی درخواست را بهصورت مجزا مدیریت کند.
پیامهای خطا برای response، request و status
در این کتابخانه Axios-based برای پیامک، وجود
error.response یعنی API پاسخی با وضعیت ناموفق ارسال
کرده است. اگر error.request موجود باشد اما پاسخی
دریافت نشود، مشکل به مرحله ارسال درخواست یا ارتباط با سرور مربوط
است. سایر خطاها نیز میتوانند هنگام آمادهسازی درخواست رخ دهند.
- 1 API Response Error پاسخ دریافت شده، اما status درخواست موفق نیست.
- 2 No Response درخواست ساخته و ارسال شده، اما پاسخی از سرور نرسیده است.
- 3 Request Setup Error خطا پیش از تکمیل ارسال و هنگام آمادهسازی درخواست رخ داده است.
if (error.response) {
// API returned an error response
} else if (error.request) {
// Request sent, no response received
} else {
// Request setup error
}
بازگشت response.data در حالت موفق
متدهای ارسال در این Node SMS library پس از اجرای موفق درخواست،
مستقیماً response.data دریافتی از Axios را بازمیگردانند.
در نتیجه، خروجی یک کلاس سفارشی نیست و میتوان داده بازگشتی API را
با async/await دریافت و برای ثبت لاگ، نمایش وضعیت یا
ادامه فرایند برنامه استفاده کرد.
try {
const result = await client.sendVOTP(
"12345",
"989121234567"
);
console.log(result);
} catch (error) {
console.error(error.message);
}
سوالات متداول کار با sdk ارسال پیامک node.js
پاسخ به متداولترین پرسشهای فنی پیرامون راهاندازی و اتصال Node به API پیامک آرتا پیامک
بله، این پکیج پیامک Node.js به صورت کاملاً ماژولار و مستقل طراحی شده است. شما میتوانید به راحتی از آن در پروژههای مبتنی بر Express.js، NestJS، Fastify و سایر فریمورکهای جاوا اسکریپت در سمت بکاند استفاده کنید. کافی است کتابخانه ارسال پیامک جاوااسکریپت را مقداردهی کرده و در لایههای سرویس یا کنترلر خود فراخوانی کنید.
بله، تمام متدهای عملیاتی این پکیج از جمله sendPattern، sendVOTP و sendWebservice کاملاً ناهمگام (Asynchronous) بوده و خروجی مبتنی بر Promise بازمیگردانند. این ساختار به شما اجازه میدهد تا با استفاده از الگوهای مدرن async/await یا .then()/.catch() به مدیریت ارسال SMS در Node بپردازید.
این پکیج یک کتابخانه Axios-based برای پیامک است؛ بنابراین در هنگام بروز خطا، پکیج خطاهای خام ایجادشده توسط Axios را بازمیگرداند. شما میتوانید خطاهای مربوط به عدم دسترسی به شبکه را از خطاهای صادرشده توسط سرور پنل پیامک (مانند نامعتبر بودن API Key یا اتمام شارژ) بر اساس فیلدهای error.response و error.request به صورت کاملاً مجزا مدیریت و لاگ کنید.
به صورت پیشفرض، آدرس اتصال به API بر روی https://edge.ippanel.com/v1/api تنظیم شده است. با این حال، جهت هدایت درخواستها از طریق پروکسی، اینترانت یا سرورهای اختصاصی، میتوانید در زمان نمونهسازی کلاینت، آدرس سفارشی خود را به عنوان آرگومان دوم به تابع createClient('API_KEY', 'CUSTOM_URL') یا سازنده کلاس پاس دهید تا فرآیند اتصال مستقیم JavaScript به پنل پیامک با موفقیت انجام شود.
بله، یکی از متدهای کاربردی این SDK متد sendVOTP است. شما با استفاده از این متد و راهاندازی نمونه کد VOTP در Node.js میتوانید کدهای تایید یکبار مصرف (OTP) و پیامکهای اطلاعرسانی حساس به زمان را با بالاترین سرعت و اولویت به مخاطبانتان ارسال کنید. این فرآیند از بهینهترین کانالهای مخابراتی آرتا پیامک عبور داده میشود.
بله، پکیج ippanel-node-sdk دارای فایل تعاریف رسمی تایپها به نام index.d.ts است. این ویژگی باعث میشود که توسعهدهندگانی که از زبان TypeScript در پروژههای خود استفاده میکنند، از قابلیت تکمیل خودکار کدها (Autocompletion) و بررسی استاتیک نوع دادهها (Type Checking) بهرهمند شوند که این امر فرآیند توسعه Node SMS library را سریعتر و امنتر میکند.