خودکارسازی اسناد Swagger با Joi در Node.js: گردش کار اسناد API خود را ساده کنید

حفظ اسناد API دقیق و بهروز یک چالش رایج برای توسعهدهندگان است، بهویژه هنگام کار در تیمها. به روز رسانی دستی فحش دادن فایلهای هر مسیر API میتوانند منجر به تضادهای مکرر ادغام و ناسازگاری بین رفتار واقعی API و مستندات شوند. این مسائل نه تنها باعث کاهش سرعت توسعه می شود، بلکه می تواند منجر به سردرگمی و خطا در هنگام استفاده از API شود.
راه حل؟ تولید خودکار را انجام دهید فحش دادن با استفاده از مستندات جوی طرحواره های اعتبارسنجی در Node.js با اکسپرس. با انجام این کار، اطمینان حاصل می کنید که اسناد شما با پایگاه کد شما همگام می ماند و در عین حال نیاز به به روز رسانی دستی را از بین می برد.
در این مقاله به موارد زیر خواهیم پرداخت:
- راه اندازی جوی اعتبار سنجی و فحش دادن اتوماسیون مستندسازی
- حل مشکل بهروزرسانی دستی Swagger و تداخلهای ادغام.
- اطمینان از اعتبار سنجی قرارداد API قوی برای همه مسیرها.
بیایید آن را مرحله به مرحله تجزیه کنیم.
مشکل: تعمیر و نگهداری دستی Swagger
هنگام توسعه یک API، بهروزرسانی دستی اسناد Swagger برای هر مسیر معمول است. در تیمهای بزرگ، زمانی که چندین توسعهدهنده یک فایل را ویرایش میکنند، این منجر به درگیری میشود که اغلب منجر به از دست رفتن تغییرات، اسناد ناسازگار و اتلاف زمان برای حل تضادهای ادغام میشود.
با خودکارسازی تولید اسناد Swagger با استفاده از جوی، ما می توانیم این مشکل را حل کنیم. جوی به ما اجازه میدهد تا درخواستهای دریافتی را اعتبارسنجی کنیم تا مطمئن شویم که با انتظارات ما مطابقت دارند، و در عین حال، میتوانیم از آنها استفاده کنیم. جوی طرحواره هایی برای تولید اسناد Swagger به طور خودکار.
این رویکرد تضمین میکند که مستندات همیشه دقیق، هماهنگ با پایگاه کد هستند و ساختار واقعی API را منعکس میکنند.
مرحله 1: راهاندازی میانافزار اعتبارسنجی Joi
اولین مرحله ایجاد میان افزار است که درخواست های دریافتی را با استفاده از اعتبارسنجی می کند جوی. این میان افزار تضمین می کند که پارامترهای درخواست، هدرها، بدنه و رشته های پرس و جو مطابق طرحی که شما تعریف می کنید معتبر هستند. علاوه بر این، همان جوی طرحواره برای تولید خودکار اسناد Swagger استفاده خواهد شد.
این میان افزار است:
const Joi = require("joi");
const schemasEnum = Object.freeze({
BODY: 'body',
PARAMS: 'params',
QUERY: 'query',
HEADERS: 'headers'
});
const validationMiddleware = (schema) => {
return (request, response, nextFunction) => {
const validationOptions = {
abortEarly: false,
allowUnknown: true,
stripUnknown: true
};
const schemas = Object.values(schemasEnum);
const validationResults = {};
for (const key of schemas) {
if (schema[key]) {
const { error, value } = schema[key].validate(request[key], validationOptions);
if (error) {
return response.status(400).json({
error: `Validation error in ${key}: ${error.details.map((x) => x.message).join(', ')}`
});
} else {
validationResults[key] = value;
}
}
}
Object.assign(request, validationResults);
nextFunction();
};
};
module.exports = { validationMiddleware };
این میان افزار درخواست های دریافتی را بر اساس طرحی که برای هر مسیر تعریف شده است تایید می کند. اگر اعتبار سنجی ناموفق باشد، یک خطا برمی گرداند. در غیر این صورت، به درخواست اجازه ادامه می دهد.
مرحله 2: ثبت مسیرها با Joi و تولید خودکار Swagger
در مرحله بعد، ما یک تابع ایجاد می کنیم که مسیرها را ثبت می کند و به طور خودکار اسناد Swagger را با استفاده از آن ایجاد می کند شادی به سواگر کتابخانه این تابع میان افزار اعتبارسنجی را اعمال می کند و مستندات Swagger را همزمان تولید می کند.
در اینجا نحوه registerRoute
عملکرد کار می کند:
const { validationMiddleware } = require("../middlewares/validationMiddelware");
const convert = require("joi-to-swagger");
const routes = [];
const registerRoute = (router, {
method,
path,
schema = {},
handler,
middlewares = [],
summary,
description,
tags = []
}) => {
if (schema && Object.keys(schema).length > 0) {
middlewares.unshift(validationMiddleware(schema));
}
router[method](path, ...middlewares, handler);
const parameters = [];
const requestBody = {};
if (schema.params) {
const { swagger: paramsSwagger } = convert(schema.params);
parameters.push(...Object.keys(paramsSwagger.properties).map(key => ({
name: key,
in: 'path',
required: schema.params._flags.presence === 'required',
schema: paramsSwagger.properties[key],
description: "paramsSwagger.properties[key].description"
})));
}
if (schema.query) {
const { swagger: querySwagger } = convert(schema.query);
parameters.push(...Object.keys(querySwagger.properties).map(key => ({
name: key,
in: 'query',
required: schema.query._flags.presence === 'required',
schema: querySwagger.properties[key],
description: "querySwagger.properties[key].description"
})));
}
if (schema.body) {
const { swagger: bodySwagger } = convert(schema.body);
requestBody.content = {
'application/json': {
schema: bodySwagger
}
};
}
routes.push({
path,
method,
summary,
description,
tags,
parameters,
requestBody
});
};
module.exports = { registerRoute, routes };
این تابع مسیر را ثبت می کند، جوی میان افزار اعتبارسنجی، و اسناد Swagger را به طور خودکار برای مسیر تولید می کند. را شادی به سواگر کتابخانه مسئول تبدیل جوی طرحواره در قالب Swagger.
مرحله 3: تعریف طرحواره Joi برای مسیرها
حالا بیایید آن را تعریف کنیم جوی طرح اعتبارسنجی برای یک مسیر در این مثال، طرحواره ای برای واریز موجودی تعریف می کنیم. آن را تایید می کند userId
پارامتر و amount
در بدنه درخواست
اینجاست جوی طرحواره:
const Joi = require("joi");
const { appErrorSchema } = require("../../../shared/infra/http/schemas/AppErrorSchema");
const depositBalanceParamsSchema = Joi.object({
userId: Joi.number().integer().required().description("User id"),
});
const depositBalanceBodySchema = Joi.object({
amount: Joi.number().positive().greater(0).required().description("Amount to deposit"),
});
const depositBalanceResponsesSchema = {
204: Joi.any().empty(),
400: appErrorSchema,
404: appErrorSchema,
};
module.exports = { depositBalanceParamsSchema, depositBalanceBodySchema, depositBalanceResponsesSchema };
در این طرح:
- را
userId
باید یک عدد صحیح مورد نیاز باشد. - را
amount
باید یک عدد مثبت بزرگتر از 0 باشد. - پاسخ ها شامل اعتبار سنجی برای کدهای وضعیت هستند
204
،400
، و404
با استفاده از طرحواره خطا
مرحله 4: ثبت مسیر مانده سپرده
اکنون که طرح را داریم، بیایید مسیری ایجاد کنیم که درخواست ورودی را تأیید می کند و به طور خودکار اسناد Swagger را تولید می کند:
const { Router } = require("express");
const { DepositBalanceController } = require("../../../useCases/depositBalance/DepositBalanceController");
const { registerRoute } = require("../../../../shared/infra/http/routes/registerRoute");
const { depositBalanceParamsSchema, depositBalanceBodySchema, depositBalanceResponsesSchema } = require("../../../useCases/depositBalance/DepositBalanceSchema");
const balancesRouter = Router();
const depositBalanceController = new DepositBalanceController();
registerRoute(balancesRouter, {
description: "\"Deposit balance\","
handler: depositBalanceController.handle,
method: "post",
path: "/balances/deposit/:userId",
summary: "Deposit balance",
schema: {
params: depositBalanceParamsSchema,
body: depositBalanceBodySchema,
responses: depositBalanceResponsesSchema
},
tags: ["Balances"]
});
module.exports = { balancesRouter };
این مسیر به درخواستهای سپرده رسیدگی میکند و با استفاده از آن اعتبارسنجی میکند جوی طرحواره ای که قبلا تعریف شده بود. اسناد Swagger به طور خودکار بر اساس ایجاد می شود جوی طرحواره
مرحله 5: ایجاد سند Swagger
برای ارائه اسناد Swagger، مسیرهای ثبت شده را جمع آوری می کنیم و سند Swagger را بر اساس تعاریف مسیر ایجاد می کنیم.
const { routes } = require("../routes/registerRoute");
const swaggerDocument = {
openapi: '3.0.0',
info: {
title: "'API Documentation',"
version: '1.0.0'
},
paths: {}
};
routes.forEach(route => {
const path = route.path.replace(/:([a-zA-Z0-9_]+)/g, '{$1}');
if (!swaggerDocument.paths[path]) {
swaggerDocument.paths[path] = {};
}
swaggerDocument.paths[path][route.method] = {
summary: route.summary,
description: "route.description,"
tags: route.tags,
parameters: route.parameters,
requestBody: route.requestBody
};
});
module.exports = { swaggerDocument };
این کد به صورت پویا سند Swagger را با استفاده از مسیرهای ثبت شده می سازد.
مرحله 6: راه اندازی سرور اکسپرس
برای تکمیل پیادهسازی، سرور Express را راهاندازی کرده و نقطه پایانی مستندات Swagger را اضافه میکنیم.
اینجاست server.js فایل:
// server.js
const app = require('./app');
init();
async function init() {
try {
app.listen(3001, () => {
console.log('Express App Listening on Port 3001');
});
} catch (error) {
console.error(`An error occurred: ${JSON.stringify(error)}`);
process.exit(1);
}
}
و app.js فایل:
// app.js
require("express-async-errors");
const express = require('express');
const bodyParser = require('body-parser');
const { appRouter } =
require("./modules/shared/infra/http/routes/app.routes");
const swaggerUi = require("swagger-ui-express");
const { swaggerDocument } = require("./swagger/swaggerConfig");
const app = express();
app.use(bodyParser.json());
// Use your app's routes
app.use(appRouter);
// Serve the Swagger documentation
app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerDocument));
module.exports = app;
هنگامی که سرور در حال اجرا است، می توانید به اسناد Swagger در آدرس زیر دسترسی داشته باشید:
http://localhost:3001/api-docs
نحوه نصب و اجرا
برای اجرای پروژه و تنظیم اسناد Swagger خودکار، مراحل زیر را دنبال کنید:
- Dependencies را نصب کنید: مطمئن شوید که تمام کتابخانه های مورد نیاز از جمله را نصب کرده اید بیان کنید، joi، swagger-ui-express، و شادی به سواگر.
npm install express joi joi-to-swagger swagger-ui-express body-parser express-async-errors
این کتابخانهها برای راهاندازی سرور Express، اعتبارسنجی درخواستهای دریافتی ضروری هستند جویو ایجاد اسناد Swagger به صورت خودکار.
- سرور را اجرا کنید: هنگامی که وابستگی ها نصب شدند، می توانید سرور را با استفاده از:
node server.js
با این کار سرور Express شما راه اندازی می شود و به پورت 3001 (یا هر پورت دیگری که مشخص می کنید) گوش می دهد.
- دسترسی به اسناد Swagger: مرورگر خود را باز کنید و به آدرس اینترنتی زیر بروید تا اسناد Swagger را که به طور خودکار تولید می شود، مشاهده کنید:
http://localhost:3001/api-docs
این نقطه پایانی رابط کاربری تعاملی Swagger را ارائه می دهد و به شما امکان می دهد مسیرهای API خود را مستقیماً در مرورگر آزمایش و کاوش کنید.
نتیجه گیری
اتوماسیون فحش دادن مستندات با جوی فرآیند مستندسازی را ساده می کند، تضادهای ادغام را حذف می کند و تضمین می کند که اسناد API شما همیشه با کد واقعی شما همگام است. با استفاده از جوی طرحواره های اعتبارسنجی برای تولید خودکار اسناد Swagger، در زمان صرفه جویی می کنید و دقت قراردادهای API خود را بهبود می بخشید.
با مراحل ذکر شده در این مقاله، می توانید به راحتی تولید Swagger خودکار را در پروژه های Node.js خود ادغام کنید و گردش کار توسعه خود را روان تر و کارآمدتر کنید.
به طور خلاصه:
- جوی اعتبار سنجی درخواست را ساده می کند و تضمین می کند که داده های دریافتی با قالب مورد انتظار مطابقت دارند.
- فحش دادن اسناد به طور خودکار از جوی طرحواره ها، حذف به روز رسانی های دستی.
- توسعه دهندگان می توانند بدون نگرانی در مورد همگام سازی اسناد و قراردادهای API روی نوشتن کد تمرکز کنند.
این رویکرد راهحلی قوی برای اعتبارسنجی و مستندسازی API ارائه میکند و به تیمها اجازه میدهد کارآمدتر و با خطاهای کمتری کار کنند.