ఎక్స్ప్రెస్.జెఎస్ అప్లికేషన్లలో టైప్స్క్రిప్ట్ మిడిల్వేర్ను అర్థం చేసుకోవడానికి మరియు అమలు చేయడానికి ఒక సమగ్ర గైడ్. బలమైన మరియు నిర్వహించదగిన కోడ్ కోసం అధునాతన రకం నమూనాలను అన్వేషించండి.
టైప్స్క్రిప్ట్ మిడిల్వేర్: ఎక్స్ప్రెస్ మిడిల్వేర్ టైప్ నమూనాలలో నైపుణ్యం
ఎక్స్ప్రెస్.జెఎస్, ఒక మినిమలిస్ట్ మరియు సౌకర్యవంతమైన నోడ్.జెఎస్ వెబ్ అప్లికేషన్ ఫ్రేమ్వర్క్, డెవలపర్లు బలమైన మరియు స్కేలబుల్ API లు మరియు వెబ్ అప్లికేషన్లను నిర్మించడానికి అనుమతిస్తుంది. టైప్స్క్రిప్ట్ స్టాటిక్ టైపింగ్ను జోడించడం ద్వారా ఎక్స్ప్రెస్ను మెరుగుపరుస్తుంది, కోడ్ నిర్వహణను మెరుగుపరుస్తుంది మరియు ప్రారంభంలోనే లోపాలను పట్టుకుంటుంది. మిడిల్వేర్ విధులు ఎక్స్ప్రెస్కు మూలస్తంభం, ఇది మీ మార్గ హ్యాండ్లర్లను చేరుకునే ముందు అభ్యర్థనలను అడ్డుకోవడానికి మరియు ప్రాసెస్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఈ ఆర్టికల్ ఎక్స్ప్రెస్ మిడిల్వేర్ను నిర్వచించడానికి మరియు ఉపయోగించుకోవడానికి అధునాతన టైప్స్క్రిప్ట్ టైప్ నమూనాలను అన్వేషిస్తుంది, టైప్ భద్రత మరియు కోడ్ స్పష్టతను పెంచుతుంది.
ఎక్స్ప్రెస్ మిడిల్వేర్ను అర్థం చేసుకోవడం
మిడిల్వేర్ విధులు అభ్యర్థన వస్తువు (req), ప్రతిస్పందన వస్తువు (res), మరియు అప్లికేషన్ యొక్క అభ్యర్థన-ప్రతిస్పందన చక్రంలో తదుపరి మిడిల్వేర్ ఫంక్షన్కు యాక్సెస్ కలిగి ఉన్న విధులు. మిడిల్వేర్ విధులు క్రింది పనులను చేయగలవు:
- ఏదైనా కోడ్ను అమలు చేయండి.
- అభ్యర్థన మరియు ప్రతిస్పందన వస్తువులలో మార్పులు చేయండి.
- అభ్యర్థన-ప్రతిస్పందన చక్రాన్ని ముగించండి.
- స్టాక్లో తదుపరి మిడిల్వేర్ ఫంక్షన్ను కాల్ చేయండి.
మిడిల్వేర్ విధులు ఎక్స్ప్రెస్ అప్లికేషన్కు జోడించినప్పుడు సీక్వెన్షియల్గా అమలు చేయబడతాయి. మిడిల్వేర్ కోసం సాధారణ ఉపయోగ సందర్భాలు ఉన్నాయి:
- అభ్యర్థనలను లాగింగ్ చేయడం.
- వినియోగదారులను ప్రమాణీకరించడం.
- వనరులకు ప్రాప్యతను అధికారం చేయడం.
- అభ్యర్థన డేటాను ధృవీకరించడం.
- లోపాలను నిర్వహించడం.
బేసిక్ టైప్స్క్రిప్ట్ మిడిల్వేర్
బేసిక్ టైప్స్క్రిప్ట్ ఎక్స్ప్రెస్ అప్లికేషన్లో, మిడిల్వేర్ ఫంక్షన్ ఇలా ఉండవచ్చు:
import { Request, Response, NextFunction } from 'express';
function loggerMiddleware(req: Request, res: Response, next: NextFunction) {
console.log(`Request: ${req.method} ${req.url}`);
next();
}
export default loggerMiddleware;
ఈ సాధారణ మిడిల్వేర్ అభ్యర్థన పద్ధతి మరియు URL ని కన్సోల్కు లాగ్ చేస్తుంది. టైప్ వ్యాఖ్యానించబడిన వాటిని విడగొడదాం:
Request: ఎక్స్ప్రెస్ అభ్యర్థన వస్తువును సూచిస్తుంది.Response: ఎక్స్ప్రెస్ ప్రతిస్పందన వస్తువును సూచిస్తుంది.NextFunction: అమలు చేసినప్పుడు, స్టాక్లో తదుపరి మిడిల్వేర్ను అమలు చేసే ఫంక్షన్.
మీరు దీన్ని మీ ఎక్స్ప్రెస్ అప్లికేషన్లో ఈ విధంగా ఉపయోగించవచ్చు:
import express from 'express';
import loggerMiddleware from './middleware/loggerMiddleware';
const app = express();
const port = 3000;
app.use(loggerMiddleware);
app.get('/', (req, res) => {
res.send('Hello, world!');
});
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
మిడిల్వేర్ కోసం అధునాతన రకం నమూనాలు
ప్రాథమిక మిడిల్వేర్ ఉదాహరణ పనిచేస్తుండగా, ఇది మరింత సంక్లిష్టమైన దృశ్యాలకు వశ్యత మరియు టైప్ భద్రతను కలిగి ఉండదు. టైప్స్క్రిప్ట్తో మిడిల్వేర్ అభివృద్ధిని మెరుగుపరిచే అధునాతన టైప్ నమూనాలను అన్వేషిద్దాం.
1. కస్టమ్ అభ్యర్థన/ప్రతిస్పందన రకాలు
తరచుగా, మీరు కస్టమ్ లక్షణాలతో Request లేదా Response వస్తువులను విస్తరించాలి. ఉదాహరణకు, ప్రమాణీకరణ తర్వాత, మీరు user ఆస్తిని Request వస్తువుకు జోడించాలనుకోవచ్చు. టైప్స్క్రిప్ట్ డిక్లరేషన్ విలీనాన్ని ఉపయోగించి ఇప్పటికే ఉన్న రకాలను పెంచడానికి మిమ్మల్ని అనుమతిస్తుంది.
// src/types/express/index.d.ts
import { Request as ExpressRequest } from 'express';
declare global {
namespace Express {
interface Request {
user?: {
id: string;
email: string;
// ... other user properties
};
}
}
}
export {}; // This is needed to make the file a module
ఈ ఉదాహరణలో, మేము ఐచ్ఛిక user ఆస్తిని చేర్చడానికి Express.Request ఇంటర్ఫేస్ను పెంచుతున్నాము. ఇప్పుడు, మీ ప్రమాణీకరణ మిడిల్వేర్లో, మీరు ఈ ఆస్తిని నింపవచ్చు:
import { Request, Response, NextFunction } from 'express';
function authenticationMiddleware(req: Request, res: Response, next: NextFunction) {
// Simulate authentication logic
const userId = req.headers['x-user-id'] as string; // Or fetch from a token, etc.
if (userId) {
// In a real application, you would fetch the user from a database
req.user = {
id: userId,
email: `user${userId}@example.com`
};
next();
} else {
res.status(401).send('Unauthorized');
}
}
export default authenticationMiddleware;
మరియు మీ మార్గ హ్యాండ్లర్లలో, మీరు req.user ఆస్తిని సురక్షితంగా యాక్సెస్ చేయవచ్చు:
import express from 'express';
import authenticationMiddleware from './middleware/authenticationMiddleware';
const app = express();
const port = 3000;
app.use(authenticationMiddleware);
app.get('/profile', (req: Request, res: Response) => {
if (req.user) {
res.send(`Hello, ${req.user.email}! Your user ID is ${req.user.id}`);
} else {
// This should never happen if the middleware is working correctly
res.status(500).send('Internal Server Error');
}
});
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
2. మిడిల్వేర్ ఫ్యాక్టరీలు
మిడిల్వేర్ ఫ్యాక్టరీలు మిడిల్వేర్ ఫంక్షన్లను తిరిగి ఇచ్చే విధులు. మీకు నిర్దిష్ట ఎంపికలు లేదా డిపెండెన్సీలతో మిడిల్వేర్ను కాన్ఫిగర్ చేయవలసి వచ్చినప్పుడు ఈ నమూనా ఉపయోగపడుతుంది. ఉదాహరణకు, నిర్దిష్ట ఫైల్కు సందేశాలను లాగ్ చేసే లాగింగ్ మిడిల్వేర్ను పరిగణించండి:
import { Request, Response, NextFunction } from 'express';
import fs from 'fs';
import path from 'path';
function createLoggingMiddleware(logFilePath: string) {
return (req: Request, res: Response, next: NextFunction) => {
const logMessage = `[${new Date().toISOString()}] Request: ${req.method} ${req.url}\n`;
fs.appendFile(logFilePath, logMessage, (err) => {
if (err) {
console.error('Error writing to log file:', err);
}
next();
});
};
}
export default createLoggingMiddleware;
మీరు ఈ మిడిల్వేర్ ఫ్యాక్టరీని ఇలా ఉపయోగించవచ్చు:
import express from 'express';
import createLoggingMiddleware from './middleware/loggingMiddleware';
const app = express();
const port = 3000;
const logFilePath = path.join(__dirname, 'logs', 'requests.log');
app.use(createLoggingMiddleware(logFilePath));
app.get('/', (req, res) => {
res.send('Hello, world!');
});
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
3. అసమకాలిక మిడిల్వేర్
మిడిల్వేర్ విధులు తరచుగా డేటాబేస్ ప్రశ్నలు లేదా API కాల్స్ వంటి అసమకాలిక కార్యకలాపాలను నిర్వహించాలి. అసమకాలిక కార్యకలాపాలను సరిగ్గా నిర్వహించడానికి, అసమకాలిక ఆపరేషన్ పూర్తయిన తర్వాత మీరు తప్పనిసరిగా next ఫంక్షన్ను పిలవాలి. మీరు దీనిని async/await లేదా వాగ్దానాలను ఉపయోగించి సాధించవచ్చు.
import { Request, Response, NextFunction } from 'express';
async function asyncMiddleware(req: Request, res: Response, next: NextFunction) {
try {
// Simulate an asynchronous operation
await new Promise(resolve => setTimeout(resolve, 100));
console.log('Asynchronous operation completed');
next();
} catch (error) {
next(error); // Pass the error to the error handling middleware
}
}
export default asyncMiddleware;
ముఖ్యమైనది: మీ అసమకాలిక మిడిల్వేర్లో లోపాలను నిర్వహించాలని మరియు వాటిని next(error) ఉపయోగించి లోపం నిర్వహణ మిడిల్వేర్కు పంపాలని గుర్తుంచుకోండి. ఇది లోపాలు సరిగ్గా నిర్వహించబడతాయి మరియు లాగ్ చేయబడతాయి.
4. లోపం నిర్వహణ మిడిల్వేర్
లోపం నిర్వహణ మిడిల్వేర్ అనేది అభ్యర్థన-ప్రతిస్పందన చక్రంలో సంభవించే లోపాలను నిర్వహించే ఒక ప్రత్యేక రకం మిడిల్వేర్. లోపం నిర్వహణ మిడిల్వేర్ విధులు నాలుగు వాదనలను కలిగి ఉంటాయి: err, req, res, మరియు next.
import { Request, Response, NextFunction } from 'express';
function errorHandler(err: any, req: Request, res: Response, next: NextFunction) {
console.error(err.stack);
res.status(500).send('Something went wrong!');
}
export default errorHandler;
మీరు ఇతర మిడిల్వేర్ మరియు మార్గ హ్యాండ్లర్లన్నిటికీ తరువాత లోపం నిర్వహణ మిడిల్వేర్ను నమోదు చేయాలి. నాలుగు వాదనల ఉనికి ద్వారా ఎక్స్ప్రెస్ లోపం నిర్వహణ మిడిల్వేర్ను గుర్తిస్తుంది.
import express from 'express';
import asyncMiddleware from './middleware/asyncMiddleware';
import errorHandler from './middleware/errorHandler';
const app = express();
const port = 3000;
app.use(asyncMiddleware);
app.get('/', (req, res) => {
throw new Error('Simulated error!'); // Simulate an error
});
app.use(errorHandler); // Error handling middleware MUST be registered last
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
5. అభ్యర్థన ధ్రువీకరణ మిడిల్వేర్
సురక్షితమైన మరియు నమ్మదగిన API లను నిర్మించడంలో అభ్యర్థన ధ్రువీకరణ ఒక ముఖ్యమైన అంశం. మిడిల్వేర్ను ఉపయోగించి ఇన్కమింగ్ అభ్యర్థన డేటాను ధృవీకరించవచ్చు మరియు మీ మార్గ హ్యాండ్లర్లను చేరుకునే ముందు అది కొన్ని ప్రమాణాలకు అనుగుణంగా ఉందని నిర్ధారించుకోవచ్చు. joi లేదా express-validator వంటి లైబ్రరీలను అభ్యర్థన ధ్రువీకరణ కోసం ఉపయోగించవచ్చు.
express-validator ను ఉపయోగించే ఒక ఉదాహరణ ఇక్కడ ఉంది:
import { Request, Response, NextFunction } from 'express';
import { body, validationResult } from 'express-validator';
const validateCreateUserRequest = [
body('email').isEmail().normalizeEmail(),
body('password').isLength({ min: 8 }),
(req: Request, res: Response, next: NextFunction) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
next();
}
];
export default validateCreateUserRequest;
ఈ మిడిల్వేర్ అభ్యర్థన బాడీలో email మరియు password ఫీల్డ్లను ధృవీకరిస్తుంది. ధ్రువీకరణ విఫలమైతే, అది లోపాల సందేశాల శ్రేణితో 400 బ్యాడ్ రిక్వెస్ట్ ప్రతిస్పందనను అందిస్తుంది. మీరు మీ మార్గ హ్యాండ్లర్లలో ఈ మిడిల్వేర్ను ఇలా ఉపయోగించవచ్చు:
import express from 'express';
import validateCreateUserRequest from './middleware/validateCreateUserRequest';
const app = express();
const port = 3000;
app.post('/users', validateCreateUserRequest, (req, res) => {
// If validation passes, create the user
res.send('User created successfully!');
});
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
6. మిడిల్వేర్ కోసం డిపెండెన్సీ ఇంజెక్షన్
మీ మిడిల్వేర్ విధులు బాహ్య సేవలు లేదా కాన్ఫిగరేషన్లపై ఆధారపడినప్పుడు, డిపెండెన్సీ ఇంజెక్షన్ పరీక్షించదగినది మరియు నిర్వహించదగినదిగా చేయడానికి సహాయపడుతుంది. మీరు tsyringe వంటి డిపెండెన్సీ ఇంజెక్షన్ కంటైనర్ను ఉపయోగించవచ్చు లేదా మీ మిడిల్వేర్ ఫ్యాక్టరీలకు వాదనలుగా డిపెండెన్సీలను పంపవచ్చు.
డిపెండెన్సీ ఇంజెక్షన్తో మిడిల్వేర్ ఫ్యాక్టరీని ఉపయోగించే ఒక ఉదాహరణ ఇక్కడ ఉంది:
// src/services/UserService.ts
export class UserService {
async createUser(email: string, password: string): Promise {
// In a real application, you would save the user to a database
console.log(`Creating user with email: ${email} and password: ${password}`);
await new Promise(resolve => setTimeout(resolve, 500)); // Simulate a database operation
}
}
// src/middleware/createUserMiddleware.ts
import { Request, Response, NextFunction } from 'express';
import { UserService } from '../services/UserService';
function createCreateUserMiddleware(userService: UserService) {
return async (req: Request, res: Response, next: NextFunction) => {
try {
const { email, password } = req.body;
await userService.createUser(email, password);
res.status(201).send('User created successfully!');
} catch (error) {
next(error);
}
};
}
export default createCreateUserMiddleware;
// src/app.ts
import express from 'express';
import createCreateUserMiddleware from './middleware/createUserMiddleware';
import { UserService } from './services/UserService';
import errorHandler from './middleware/errorHandler';
const app = express();
const port = 3000;
app.use(express.json()); // Parse JSON request bodies
const userService = new UserService();
const createUserMiddleware = createCreateUserMiddleware(userService);
app.post('/users', createUserMiddleware);
app.use(errorHandler);
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
టైప్స్క్రిప్ట్ మిడిల్వేర్ కోసం ఉత్తమ పద్ధతులు
- మిడిల్వేర్ ఫంక్షన్లను చిన్నవిగా మరియు దృష్టి కేంద్రీకరించండి. ప్రతి మిడిల్వేర్ ఫంక్షన్ ఒకే ఒక బాధ్యతను కలిగి ఉండాలి.
- మీ మిడిల్వేర్ ఫంక్షన్ల కోసం వివరణాత్మక పేర్లను ఉపయోగించండి. మిడిల్వేర్ ఏమి చేస్తుందో పేరు స్పష్టంగా సూచించాలి.
- లోపాలను సరిగ్గా నిర్వహించండి. ఎల్లప్పుడూ లోపాలను పట్టుకోండి మరియు వాటిని
next(error)ఉపయోగించి లోపం నిర్వహణ మిడిల్వేర్కు పంపండి. - టైప్ భద్రతను మెరుగుపరచడానికి కస్టమ్ అభ్యర్థన/ప్రతిస్పందన రకాలను ఉపయోగించండి. అవసరమైన విధంగా కస్టమ్ లక్షణాలతో
RequestమరియుResponseఇంటర్ఫేస్లను పెంచండి. - నిర్దిష్ట ఎంపికలతో మిడిల్వేర్ను కాన్ఫిగర్ చేయడానికి మిడిల్వేర్ ఫ్యాక్టరీలను ఉపయోగించండి.
- మీ మిడిల్వేర్ ఫంక్షన్లను డాక్యుమెంట్ చేయండి. మిడిల్వేర్ ఏమి చేస్తుందో మరియు దానిని ఎలా ఉపయోగించాలో వివరించండి.
- మీ మిడిల్వేర్ ఫంక్షన్లను పూర్తిగా పరీక్షించండి. మీ మిడిల్వేర్ ఫంక్షన్లు సరిగ్గా పనిచేస్తున్నాయని నిర్ధారించుకోవడానికి యూనిట్ పరీక్షలను రాయండి.
ముగింపు
టైప్స్క్రిప్ట్ స్టాటిక్ టైపింగ్ను జోడించడం ద్వారా, కోడ్ నిర్వహణను మెరుగుపరచడం ద్వారా మరియు ప్రారంభంలోనే లోపాలను పట్టుకోవడం ద్వారా ఎక్స్ప్రెస్ మిడిల్వేర్ అభివృద్ధిని గణనీయంగా మెరుగుపరుస్తుంది. కస్టమ్ అభ్యర్థన/ప్రతిస్పందన రకాలు, మిడిల్వేర్ ఫ్యాక్టరీలు, అసమకాలిక మిడిల్వేర్, లోపం నిర్వహణ మిడిల్వేర్ మరియు అభ్యర్థన ధ్రువీకరణ మిడిల్వేర్ వంటి అధునాతన టైప్ నమూనాలలో నైపుణ్యం సాధించడం ద్వారా, మీరు బలమైన, స్కేలబుల్ మరియు టైప్-సేఫ్ ఎక్స్ప్రెస్ అప్లికేషన్లను నిర్మించవచ్చు. మీ మిడిల్వేర్ ఫంక్షన్లను చిన్నవిగా, దృష్టి కేంద్రీకరించడానికి మరియు బాగా డాక్యుమెంట్ చేయడానికి ఉత్తమ పద్ధతులను అనుసరించాలని గుర్తుంచుకోండి.