[[:oktatas:web:back-end_framework:express|< Express]]
====== Express - TypeScript ======
* **Szerző:** Sallai András
* Copyright (c) 2023, Sallai András
* Szerkesztve: 2023, 2024
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]]
* Web: https://szit.hu
===== Projekt =====
A projekt elkészítése:
mkdir app01
cd app01
npm init -y
app01/
|-app/
| `-index.js
|-node_modules/
|-src/
| `-index.ts
|-package-lock.json
|-package.json
`-tsconfig.json
===== Függőségek =====
npm install express
npm install typescript @types/node @types/express --save-dev
Ha szeretnénk ts-node-t is használni a fordításhoz:
npm install ts-node --save-dev
===== tsconfig.json =====
{
"compilerOptions": {
"target": "ES6",
"module": "commonjs",
"outDir": "./app",
"strict": true,
"esModuleInterop": true
}
}
==== esModuleInterop ====
Az esModuleInterop beállítás szükséges a ES6 és CommonJS modulok együttműködéséhez.
Nélküle az például az express import csak így hajtható végre:
import * as express from 'express';
Ha true értékre van állítva használhatjuk így:
import express from 'express';
==== forceConsistentCasingInFileNames ====
Ez a beállítás nincs a fenti mintabeállításokban, de jól jöhet.
A forceConsistentCasingInFileNames ha true értékre van állítva,
a fordító az importálásoknál megköveteli a kis- és nagybetűk
egyezésének vizsgálatát. Így kompatibilis lesz a kódunk olyan
rendszerekkel is, ahol a kis- és nagybetűs fájlnevek
mást jelenthetnek.
{
"compilerOptions": {
"forceConsistentCasingInFileNames": true
}
}
==== include ====
Megadhatjuk, hogy az csak src könyvtárban keresse a .ts fájlokat:
{
"include": ["src/**/*.ts"],
}
Alapértelmezetten a minden mappában keres .ts fájt, kivéve a node_modules.
Van aki kifejezetten kizárja a node_modules használatát, de ez csak az egyértelműsíétst
szolgálja.
{
"include": ["src/**/*.ts"],
"exclude": ["node_modules"]
}
===== package.json =====
{
"name": "express-typescript",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node app/index.js",
"build": "tsc"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@types/express": "^4.17.17",
"@types/node": "^20.3.1",
"typescript": "^5.1.3"
},
"dependencies": {
"express": "^4.18.2"
}
}
==== ts-node használata ====
Legyen telepítve a ts-node csomag:
npm install ts-node
Egy lehetséges package.json scripts tulajdonság:
{
"scripts": {
"start": "ts-node src/index.ts",
"build": "tsc",
"serve": "node app/index.js"
}
}
Ha az **npm start** paranccsal indítjuk a szervert, akkor fordítás nélkül futni fog a TypeScript kódunk.
npm start
Az app könyvtár csak a build hatására jön létre:
npm run build
Az app könyvtár tartalmának futtatásához:
npm run serve
===== Szerver =====
import express, { Application, Request, Response } from 'express';
const app: Application = express();
const PORT = 8000;
app.get('/msg', (req: Request, res: Response) => {
res.json({ message: 'Helló'});
});
app.listen(PORT, () => {
console.log(`Running: localhost:${PORT}`);
});
Az Application típus használata elhagyható, mivel az **app** objektum azonnal értéket kap.
A req objektum Request és a res objektum Response használata azonban nem hagyható el.
Fordítás:
npm run build
Futtatás:
npm start
===== Router külön fájlba =====
import express, { Application, Request, Response } from 'express';
import router from './routes/api';
const app: Application = express();
const PORT = 8000;
app.use(router)
app.listen(PORT, () => {
console.log(`Running: localhost:${PORT}`);
});
import { Router, Request, Response } from 'express';
const router: Router = Router();
router.get('/msg', (req: Request, res: Response) => {
res.json({ message: 'Helló'});
});
export default router;