NestJS का उपयोग करके WebSockets की शक्ति का लाभ उठाते हुए रीयल-टाइम चैट API बनाने का तरीका जानें।

NestJS, Node.js के साथ सर्वर-साइड एप्लिकेशन बनाने के लिए एक लोकप्रिय ढांचा है। WebSockets के लिए अपने समर्थन के साथ, NestJS रीयल-टाइम चैट एप्लिकेशन विकसित करने के लिए उपयुक्त है।

तो, WebSockets क्या हैं, और आप NestJS में रीयल-टाइम चैट ऐप कैसे बना सकते हैं?

वेबसाकेट क्या हैं?

WebSockets क्लाइंट और सर्वर के बीच लगातार, रीयल-टाइम और दो-तरफ़ा संचार के लिए एक प्रोटोकॉल है।

HTTP के विपरीत जहां क्लाइंट और सर्वर के बीच अनुरोध चक्र पूरा होने पर कनेक्शन बंद हो जाता है, एक WebSocket कनेक्शन को खुला रखा जाता है और प्रतिक्रिया के लिए वापस आने के बाद भी बंद नहीं होता है अनुरोध।

नीचे दी गई छवि एक दृश्य है कि सर्वर और क्लाइंट के बीच वेबसाकेट संचार कैसे काम करता है:

द्विदिश संचार स्थापित करने के लिए, क्लाइंट सर्वर को एक WebSocket हैंडशेक अनुरोध भेजता है। अनुरोध शीर्षलेख में एक सुरक्षित वेबसॉकेट कुंजी होती है (सेक-वेबसॉकेट-की), और एक अपग्रेड: वेबसॉकेट शीर्षलेख जो एक साथ कनेक्शन: अपग्रेड करें हेडर सर्वर को प्रोटोकॉल को HTTP से WebSocket में अपग्रेड करने और कनेक्शन को खुला रखने के लिए कहता है। सीखने के बारे में

instagram viewer
जावास्क्रिप्ट में वेबसाकेट अवधारणा को और भी बेहतर ढंग से समझने में मदद करता है।

NestJS WebSocket मॉड्यूल का उपयोग करके रीयल-टाइम चैट API बनाना

Node.js दो प्रमुख WebSockets कार्यान्वयन प्रदान करता है। पहला है डब्ल्यू.एस जो नंगे वेबसाकेट लागू करता है। और दूसरा है सॉकेट.आईओ, जो अधिक उच्च-स्तरीय सुविधाएँ प्रदान करता है।

NestJS में दोनों के लिए मॉड्यूल हैं सॉकेट.आईओ और डब्ल्यू.एस. यह लेख उपयोग करता है सॉकेट.आईओ नमूना अनुप्रयोग की WebSocket सुविधाओं के लिए मॉड्यूल।

इस परियोजना में प्रयुक्त कोड एक में उपलब्ध है गिटहब रिपॉजिटरी. यह अनुशंसा की जाती है कि आप निर्देशिका संरचना को बेहतर ढंग से समझने के लिए इसे स्थानीय रूप से क्लोन करें और देखें कि सभी कोड एक दूसरे के साथ कैसे इंटरैक्ट करते हैं।

परियोजना सेटअप और स्थापना

अपना टर्मिनल खोलें और इसका उपयोग करके एक नया NestJS ऐप जनरेट करें घोंसला नया आदेश (उदा. नेस्ट न्यू चैट-ऐप). कमांड एक नई निर्देशिका बनाता है जिसमें प्रोजेक्ट फाइलें होती हैं। अब आप विकास प्रक्रिया शुरू करने के लिए तैयार हैं।

एक MongoDB कनेक्शन सेट करें

एप्लिकेशन में चैट संदेशों को बनाए रखने के लिए, आपको एक डेटाबेस की आवश्यकता होती है। यह लेख उपयोग करता है हमारे NestJS एप्लिकेशन के लिए MongoDB डेटाबेस, और दौड़ने का सबसे आसान तरीका है क्लाउड में MongoDB क्लस्टर सेट करें और अपना MongoDB URL प्राप्त करें। यूआरएल को कॉपी करें और इसे इस रूप में स्टोर करें मोंगो_यूआरआई आप में परिवर्तनशील .env फ़ाइल।

जब आप MongoDB से प्रश्न पूछते हैं, तो आपको बाद में Mongoose की भी आवश्यकता होगी। इसे चलाकर इंस्टॉल करें एनपीएम नेवला स्थापित करें आपके टर्मिनल में।

में स्रोत फ़ोल्डर, नामक एक फ़ाइल बनाएँ mongo.config.ts और उसमें निम्न कोड पेस्ट करें।

आयात {रजिस्टरए} से'@nestjs/config';

/**
* मोंगो डेटाबेस कनेक्शन कॉन्फ़िगरेशन
*/

निर्यातगलती करना रजिस्टरएएस('मोंगोडब', () => {
कॉन्स्ट {MONGO_URI} = प्रक्रिया.env; // .env फ़ाइल से
वापस करना {
उरी:`${MONGO_URI}`,
};
});

आपका प्रोजेक्ट main.ts फ़ाइल इस तरह दिखनी चाहिए:

आयात {नेस्टफैक्ट्री} से'@nestjs/core';
आयात {ऐपमॉड्यूल} से'./app.module';
आयात * जैसा CookieParser से'कुकी-पार्सर'
आयात हेलमेट से'हेलमेट'
आयात {लकड़हारा, सत्यापन पाइप} से'@nestjs/common';
आयात {सेटअपस्वैगर} से'./utils/अकड़';
आयात {एचटीपी अपवाद फ़िल्टर} से'./filters/http-Exception.filter';

asyncसमारोहबूटस्ट्रैप() {
कॉन्स्ट एप = इंतजार NestFactory.create (ऐपमॉड्यूल, { कोर्स: सत्य });
app.enableCors({
मूल: '*',
साख: सत्य
})
app.use (कुकीपार्सर ())
app.useGlobalPipes (
नया वैलिडेशनपाइप({
श्वेतसूची: सत्य
})
)
कॉन्स्ट लकड़हारा = नया लकड़हारा ('मुख्य')

app.setGlobalPrefix ('एपीआई/वी1')
app.useGlobalFilters(नया HttpExceptionFilter ());

सेटअप स्वैगर (ऐप)
app.use (हेलमेट ())

इंतजार app.listen (AppModule.port)

// लॉग डॉक्स
कॉन्स्ट baseUrl = AppModule.getBaseUrl (ऐप)
कॉन्स्ट यूआरएल = `http: //${baseUrl}:${AppModule.port}`
लकड़हारा.लॉग (`एपीआई प्रलेखन उपलब्ध है ${यूआरएल}/docs`);
}
बूटस्ट्रैप ();

चैट मॉड्यूल का निर्माण

रीयल-टाइम चैट सुविधा के साथ आरंभ करने के लिए, पहला कदम NestJS WebSockets पैकेज को स्थापित करना है। यह टर्मिनल में निम्न कमांड चलाकर किया जा सकता है।

npm इंस्टॉल @nestjs/websockets @nestjs/platform-socket.io @types/socket.io

पैकेजों को स्थापित करने के बाद, आपको निम्नलिखित कमांड चलाकर चैट मॉड्यूल उत्पन्न करना होगा

घोंसला जी मॉड्यूल चैट
घोंसला जी नियंत्रक चैट
नेस्ट जी सेवा चैट

एक बार मॉड्यूल जनरेट करने के बाद, अगला कदम NestJS में एक WebSockets कनेक्शन बनाना है। एक बनाने के chat.gateway.ts फ़ाइल के अंदर चैट फ़ोल्डर, यह वह जगह है जहाँ संदेश भेजने और प्राप्त करने वाले गेटवे को कार्यान्वित किया जाता है।

में निम्न कोड पेस्ट करें chat.gateway.ts.

आयात {
संदेश का मुख्यभाग,
सदस्यता संदेश,
वेबसॉकेटगेटवे,
वेबसॉकेट सर्वर,
} से'@nestjs/websockets';
आयात {सर्वर} से'सॉकेट.आईओ';

@WebSocketGateway()
निर्यातकक्षाचैटगेटवे{
@WebSocketServer()
सर्वर: सर्वर;
// Send_message ईवेंट के लिए सुनें
@SubscribeMessage('मेसेज भेजें')
सुनोफॉरमेसेज (@MessageBody () संदेश: स्ट्रिंग) {
यह.server.sockets.emit ('संदेश प्राप्त करें', संदेश);
}
}

कनेक्ट किए गए उपयोगकर्ताओं को प्रमाणित करना

प्रमाणीकरण वेब एप्लिकेशन का एक अनिवार्य हिस्सा है, और यह चैट एप्लिकेशन के लिए अलग नहीं है। सॉकेट से क्लाइंट कनेक्शन को प्रमाणित करने का कार्य पाया जाता है चैट्स.service.ts जैसा कि यहाँ दिखाया गया है:

@ इंजेक्शन योग्य ()
निर्यातकक्षाचैट्स सर्विस{
निर्माता(निजी लेख सेवा: प्रामाणिक सेवा) {}

async getUserFromSocket (सॉकेट: सॉकेट) {
होने देना auth_token = socket.handshake.headers.authorization;
// "बियरर" के बिना ही टोकन प्राप्त करें
auth_token = auth_token.split (' ')[1];

कॉन्स्ट उपयोगकर्ता = यह.authService.getUserFromAuthenticationToken(
auth_token
);

अगर (! उपयोगकर्ता) {
फेंकनानया Wsअपवाद('अवैध प्रत्यय पत्र।');
}
वापस करना उपयोगकर्ता;
}
}

getUserFromSocket विधि का उपयोग करता है getUserFromAuthenticationToken बियरर टोकन निकालकर वर्तमान में लॉग-इन उपयोगकर्ता को JWT टोकन से प्राप्त करने के लिए। getUserFromAuthenticationToken समारोह में कार्यान्वित किया जाता है auth.service.ts फ़ाइल जैसा कि यहाँ दिखाया गया है:

जनता async getUserFromAuthenticationToken (टोकन: स्ट्रिंग) {
कॉन्स्ट पेलोड: JwtPayload = यह.jwtService.verify (टोकन, {
गुप्त: यह.configService.get ('JWT_ACCESS_TOKEN_SECRET'),
});

कॉन्स्ट userId = payload.sub

अगर (उपयोगकर्ता पहचान) {
वापस करनायह.usersService.findById (उपयोगकर्ता आईडी);
}
}

वर्तमान सॉकेट को एक पैरामीटर के रूप में पास किया जाता है getUserFromSocket जब हैंडलकनेक्शन उसकि विधि चैटगेटवे लागू करता है ऑन गेटवे कनेक्शन इंटरफेस। यह वर्तमान में जुड़े उपयोगकर्ता के बारे में संदेश और जानकारी प्राप्त करना संभव बनाता है।

नीचे दिया गया कोड यह प्रदर्शित करता है:

// चैट.गेटवे.टीएस
@WebSocketGateway()
निर्यातकक्षाचैटगेटवेऔजारऑन गेटवे कनेक्शन{
@WebSocketServer()
सर्वर: सर्वर;

निर्माता(निजी चैट सेवा: चैट सेवा) {}

async हैंडलकनेक्शन (सॉकेट: सॉकेट) {
इंतजारयह.chatsService.getUserFromSocket (सॉकेट)
}

@SubscribeMessage('मेसेज भेजें')
async सुनोफॉरमेसेज (@MessageBody () संदेश: स्ट्रिंग, @ConnectedSocket () सॉकेट: सॉकेट) {

कॉन्स्ट उपयोगकर्ता = इंतजारयह.chatsService.getUserFromSocket (सॉकेट)
यह.server.sockets.emit ('संदेश प्राप्त करें', {
संदेश,
उपयोगकर्ता
});
}
}

आप ऊपर दी गई प्रमाणीकरण प्रणाली में शामिल फाइलों का संदर्भ दे सकते हैं गिटहब रिपॉजिटरी कार्यान्वयन की बेहतर समझ के लिए संपूर्ण कोड (आयात सहित) देखने के लिए।

डेटाबेस के लिए स्थायी चैट

उपयोगकर्ताओं को उनका संदेश इतिहास देखने के लिए, आपको संदेशों को संग्रहीत करने के लिए एक स्कीमा की आवश्यकता होती है। नामक एक नई फाइल बनाएं message.schema.ts और इसमें नीचे दिए गए कोड को पेस्ट करें (याद रखें कि आपकी उपयोगकर्ता स्कीमा या एक के लिए भंडार देखें)।

आयात {उपयोगकर्ता} से'./../उपयोगकर्ता/स्कीमा/उपयोगकर्ता.स्कीमा';
आयात {प्रोप, स्कीमा, स्कीमा फैक्ट्री} से"@nestjs/नेवला";
आयात नेवला, {दस्तावेज़} से"नेवला";

निर्यात MessageDocument टाइप करें = संदेश और दस्तावेज़;

@ स्कीमा ({
toJSON: {
गेटर्स: सत्य,
आभासी: सत्य,
},
टाइमस्टैम्प: सत्य,
})
निर्यातकक्षासंदेश{
@प्रॉप({ आवश्यक: सत्य, अद्वितीय: सत्य })
संदेश: स्ट्रिंग

@प्रॉप({ प्रकार: नेवला। योजना। प्रकार। वस्तु आईडी, संदर्भ: 'उपयोगकर्ता' })
उपयोगकर्ता: उपयोगकर्ता
}

कॉन्स्ट MessageSchema = SchemaFactory.createForClass (संदेश)

निर्यात {संदेश स्कीमा};

नीचे एक नया संदेश बनाने और सभी संदेशों को प्राप्त करने के लिए सेवाओं का कार्यान्वयन है चैट्स.service.ts.

आयात {संदेश, संदेश दस्तावेज़} से'./message.schema'; 
आयात {सॉकेट} से'सॉकेट.आईओ';
आयात {प्रमाणिक सेवा} से'./../auth/auth.service';
आयात {इंजेक्शन योग्य} से'@nestjs/common';
आयात {डब्ल्यूएस अपवाद} से'@nestjs/websockets';
आयात {इंजेक्टमॉडल} से'@nestjs/नेवला';
आयात { नमूना } सेनेवला;
आयात {मैसेजडीटीओ} से'./dto/message.dto';

@ इंजेक्शन योग्य ()
निर्यातकक्षाचैट्स सर्विस{
निर्माता(निजी लेख सेवा: प्रामाणिक सेवा, @InjectModel (Message.name) निजी संदेश मॉडल: Model) {}
...
async createMessage (संदेश: MessageDto, उपयोगकर्ता पहचान: डोरी) {
कॉन्स्ट नया संदेश = नयायह.messageModel({...message, userId})
इंतजार newMessage.save
वापस करना नया सन्देश
}
async getAllMessages() {
वापस करनायह.messageModel.find ()। पॉप्युलेट ('उपयोगकर्ता')
}
}

संदेश डीटीओ ए में कार्यान्वित किया जाता है message.dto.ts फ़ाइल में डीटीओ फ़ोल्डर में चैट निर्देशिका। आप इसे रिपॉजिटरी में भी पा सकते हैं।

आपको जोड़ने की जरूरत है संदेश आयात की सूची में मॉडल और स्कीमा चैट.मॉड्यूल.टीएस.

आयात {संदेश, संदेश स्कीमा} से'./message.schema';
आयात { मापांक } से'@nestjs/common';
आयात {चैटगेटवे} से'./chats.gateway';
आयात {चैट सेवा} से'./chats.service';
आयात {मोंगोसमॉड्यूल} से'@nestjs/नेवला';

@मापांक({
आयात: [MongooseModule.forFeature([
{ नाम: संदेश.नाम, योजना: संदेश स्कीमा}
])],
नियंत्रक: [],
प्रदाता: [चैट्स सर्विस, चैटगेटवे]
})
निर्यातकक्षाचैट मॉड्यूल{}

अंततः get_all_messages ईवेंट हैंडलर में जोड़ा गया है चैटगेटवे कक्षा में chat.gateway.ts जैसा कि निम्नलिखित कोड में देखा गया है:

// आयात...

@WebSocketGateway()
निर्यातकक्षाचैटगेटवेऔजारऑन गेटवे कनेक्शन{
...

@SubscribeMessage('get_all_messages')
async getAllMessages(@ConnectedSocket() सॉकेट: सॉकेट) {

इंतजारयह.chatsService.getUserFromSocket (सॉकेट)
कॉन्स्ट संदेश = इंतजारयह.chatsService.getAllMessages ()

यह.server.sockets.emit ('संदेश प्राप्त करें', संदेश);

वापस करना संदेशों
}
}

जब एक कनेक्टेड क्लाइंट (उपयोगकर्ता) उत्सर्जित करता है get_all_messages घटना, उनके सभी संदेश पुनर्प्राप्त किए जाएंगे, और जब वे उत्सर्जित होंगे मेसेज भेजें, एक संदेश डेटाबेस में बनाया और संग्रहीत किया जाता है, और फिर अन्य सभी जुड़े हुए ग्राहकों को भेजा जाता है।

एक बार उपरोक्त सभी चरणों के साथ हो जाने के बाद, आप अपना आवेदन शुरू कर सकते हैं एनपीएम रन स्टार्ट: dev, और पोस्टमैन जैसे वेबसाकेट क्लाइंट के साथ इसका परीक्षण करें।

NestJS के साथ रीयल-टाइम एप्लिकेशन बनाना

यद्यपि रीयल-टाइम सिस्टम बनाने के लिए अन्य प्रौद्योगिकियां हैं, वेबसाकेट बहुत लोकप्रिय हैं और कई मामलों में लागू करना आसान है, और वे चैट अनुप्रयोगों के लिए सबसे अच्छा विकल्प हैं।

रीयल-टाइम एप्लिकेशन केवल चैट एप्लिकेशन तक ही सीमित नहीं हैं, अन्य उदाहरणों में वीडियो स्ट्रीमिंग या शामिल हैं कॉलिंग एप्लिकेशन, और लाइव मौसम एप्लिकेशन, और NestJS वास्तविक समय के निर्माण के लिए शानदार टूलिंग प्रदान करता है क्षुधा।