لماذا نستخدم TypeScript مع Node.js وExpress؟
يجمع استخدام TypeScript مع Node.js وExpress بين مزايا الأنماط الثابتة وتطوير الواجهة الخلفية. هذا يعني إكمالًا تلقائيًا أفضل، وأخطاء زمن تشغيل أقل، وكودًا أسهل في الصيانة، خصوصًا في التطبيقات الكبيرة. يساعدك TypeScript على اكتشاف الأخطاء مبكرًا وجعل هياكل بيانات واجهتك البرمجية واضحة وسهلة الفهم.
إعداد المشروع
لنبدأ بإنشاء مشروع جديد لـ Node.js.
-
تهيئة مشروعك:
mkdir express-ts-api cd express-ts-api npm init -y
-
تثبيت الاعتمادات: نحتاج إلى Express للخادم وTypeScript كاعتماد للتطوير.
npm install express npm install typescript ts-node @types/node @types/express --save-dev
-
تهيئة TypeScript: أنشئ ملف
tsconfig.json
لضبط مترجم TypeScript.npx tsc --init
لتهيئة مبدئية جيدة، يمكنك استخدام التالي في
tsconfig.json
:{ "compilerOptions": { "target": "es6", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true } }
إنشاء خادم أساسي
الآن، لننشئ مجلد src
وملف index.ts
كنقطة دخول للخادم.
// src/index.ts
import express, { Request, Response } from 'express';
const app = express();
const port = 3000;
app.get('/', (req: Request, res: Response) => {
res.send('Hello, TypeScript with Express!');
});
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});
لتشغيل الخادم، أضف سكربت إلى package.json
:
"scripts": {
"start": "ts-node src/index.ts"
}
يمكنك الآن تنفيذ npm start
ثم زيارة http://localhost:3000
في المتصفح.
هيكلة واجهتك البرمجية
لواجهات قابلة للتوسّع، من الجيد فصل المسؤوليات. هيكل شائع هو إنشاء مجلدات منفصلة للمسارات، المتحكمات، والخدمات.
routes
: لتعريف نقاط النهاية.controllers
: لمعالجة طلبات واستجابات HTTP.services
: تحتوي منطق العمل.
مثال: واجهة بسيطة للمستخدمين
لننشئ واجهة بسيطة لإدارة قائمة مستخدمين.
1. متحكم المستخدم (src/controllers/userController.ts
)
import { Request, Response } from 'express';
interface User {
id: number;
name: string;
}
let users: User[] = [
{ id: 1, name: 'John Doe' },
{ id: 2, name: 'Jane Doe' },
];
export const getUsers = (req: Request, res: Response) => {
res.json(users);
};
export const createUser = (req: Request, res: Response) => {
const newUser: User = {
id: users.length + 1,
name: req.body.name,
};
users.push(newUser);
res.status(201).json(newUser);
};
2. مسارات المستخدم (src/routes/userRoutes.ts
)
import { Router } from 'express';
import { getUsers, createUser } from '../controllers/userController';
const router = Router();
router.get('/users', getUsers);
router.post('/users', createUser);
export default router;
3. تحديث index.ts
لاستخدام الميدلوير والموجه
نحتاج إلى الميدلوير express.json()
لتحليل جسم الطلب.
// src/index.ts
import express from 'express';
import userRoutes from './routes/userRoutes';
const app = express();
const port = 3000;
app.use(express.json()); // Middleware to parse JSON bodies
app.use('/api', userRoutes);
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});
الآن لديك واجهة برمجية منظمة وآمنة من ناحية الأنماط. يمكنك اختبار نقاط النهاية باستخدام أدوات مثل Postman أو curl.
يوفر هذا الأساس نقطة انطلاق صلبة لبناء واجهات REST أكثر تعقيدًا ومتانةً باستخدام Node.js وExpress وTypeScript، بما يضمن قابلية توسّع وصيانة عالية لشفرة الواجهة الخلفية.