Theory
एक Live Server के लिए पाँच Lines
Web servers पहले infrastructure जैसे feel होते थे: कुछ ऐसा जो server rooms में serious लोगों द्वारा installed हो।
आज आप एक 5 lines में लिखेंगे, इसे node app.js से चलाएँगे, और अपने ही browser में एक ऐसे address पर visit करेंगे जो कभी आपकी machine नहीं छोड़ता। FestConnect का back end, वह box जिसे Unit 4 सिर्फ़ draw करती थी, पहली बार boot होता है।
Recipe को 3 components चाहिए: http module, एक callback function, और एक port।
Theory
Components, नाम के साथ
- http module: Node HTTP बोलने के लिए एक built-in library ship करता है;
require('http')इसे load करता है (modules को अगला पूरा lesson मिलता है) - createServer(callback): server बनाता है; callback आपका counter clerk है: यह हर incoming request के लिए एक बार चलता है
- req और res: callback के 2 arguments:
reqdescribe करता है visitor ने क्या पूछा (उनका URL, method, headers);resवह reply है जो आप assemble और send करते हैं - listen(port): एक numbered door पर shop खोलता है:
server.listen(8080)
Practical
app.js: FestConnect का पहला Server
const http = require('http'); // 1: load the http module
const server = http.createServer(function (req, res) {
// this function runs ONCE PER REQUEST
res.writeHead(200, { 'Content-Type': 'text/html' });
res.write('<h1>FestConnect Live</h1>');
res.write('<p>Seats left for Garba Night: 40</p>');
res.end(); // finish and send the reply
});
server.listen(8080); // open door number 8080
console.log('Server running at http://localhost:8080');
This example runs in Gri-Learn on the web, where you can edit it and see the output.
Follow along
File से पहली Visit तक
- Listing को app.js की तरह Save कीजिए कोई भी folder; plain text; नाम convention है, law नहीं।
- चलाइए: node app.js Command prompt console.log line print करता है और फिर... कुछ नहीं। वह stillness मतलब server ALIVE है, wait कर रहा है। Ctrl+C इसे stop करता है।
- Browser में http://localhost:8080 Visit कीजिए localhost = यही machine; 8080 = वह door जो आपने खोला। Heading appear होती है: आपका पहला self-served page।
- कुछ बार Refresh कीजिए हर refresh एक fresh request है; आपका callback हर बार फिर चलता है।
Theory
req और res: एक Conversation के दो Ends
हर request आपके callback को 2 objects के साथ जगाता है:
req (request): visitor ने जो भी भेजा वह सब: अभी सबसे useful है req.url, वह path जो उन्होंने पूछा ("/", "/schedule", "/?event=garba": lesson 24 इसे पढ़ता है)।
res (response): आपका reply, 3 moves में assemble हुआ: writeHead (status + headers, पहले), write (body content, repeatable), end (seal करके send कीजिए: इसके बिना browser हमेशा wait करता है)।
नोटिस कीजिए आप और किससे मिले Unit 4 में: आपका AJAX code इन्हीं exact objects के OTHER side पर था: xhr ने जो भेजा वह req बन गया; res जो भेजता है वह responseText बन जाता है।
Quiz
http.createServer(function (req, res) {...}) में, वह function असल में कब execute होता है?
- एक बार, जब node app.js server start करता है
- हर EVERY incoming request के लिए एक बार: हर visit और refresh इसे फिर चलाता है
- Continuously, एक loop में, जब तक server चल रहा है
- सिर्फ़ जब कहीं res.end() call होता है
Show the answer
हर EVERY incoming request के लिए एक बार: हर visit और refresh इसे फिर चलाता है
Callback counter clerk है: यह एक request आने तक सोता है, इसे serve करता है, और फिर सोता है: 10 visitors का मतलब है 10 executions, और ऊपर steps में हर browser refresh ने इसे फिर से चलाया। Option A listen()'s की door खोलने वाली one-time role describe करता है, एक अलग moment। Option C उस single thread को burn कर देगा जिसे event loop protect करता है: Node आपका code सिर्फ़ events के response में चलाता है। Option D cause और effect reverse करता है: res.end() यह है कैसे हर execution अपनी reply FINISH करता है, वह नहीं जो एक को trigger करता है।
Think first
Spinner जो कभी नहीं रुकता
एक classmate के server में writeHead और write हैं पर वह res.end() भूल गया। वह localhost:8080 visit करता है। Tap करने से पहले: उसका browser exactly क्या करता है, और यह bug HTTP responses के काम करने के तरीके से कैसे follow करता है?
Show the answer
Tab हमेशा के लिए spin करता है: content शायद appear भी हो जाए (write ने इसे chunks में भेजा), पर browser wait करता रहता है क्योंकि कभी किसी ने नहीं कहा REPLY COMPLETE है। res.end() वही signal है: HTTP responses open streams हैं जब तक explicitly finish न हों, एक design जो बड़े pages को pieces में flow करने देता है (Node का no-buffering feature, पिछले lesson से)। कोई error नहीं, कोई crash नहीं: बस एक हमेशा-loading tab, जो forgotten end() calls को Node का सबसे recognisable beginner bugs में से एक बनाता है। हर response path को एक end() तक पहुँचना चाहिए।
Watch out
Setup Snags
Port पहले से इस्तेमाल में है: listen पर EADDRINUSE का मतलब है कोई दूसरा program (अक्सर आपका ही forgotten server दूसरी window में) 8080 का owner है: इसे stop कीजिए या 8081 चुनिए।
Edits कुछ नहीं करती: Node ने आपकी file start पर load की थी; changes को restart चाहिए (Ctrl+C, फिर node app.js)।
localhost सिर्फ़ आपका है: classmates आपका localhost:8080 visit नहीं कर सकते; यह कभी आपकी machine नहीं छोड़ता: deployment एक बाद के course की story है।
Theory
Unit 4 से Circle बंद होता है
Listing की HTML को एक JSON string और Content-Type application/json से replace कीजिए, और यह server exactly उन xhr.open("GET", ...) calls को answer कर सकता है जो आपके AJAX pages करते हैं: अब आपके पास wire के दोनों ends हैं, एक language में। दो refinements बाकी हैं: code को modules में organise करना (अगला), और visitor ने actually क्या पूछा वह query string से पढ़ना (उसके बाद): फिर FestConnect का server real काम करता है।
Summary
Key takeaways
- Components: http module (require('http')), एक callback के साथ createServer, req + res, और listen(port)।
- Callback हर incoming request के लिए एक बार चलता है: event loop visitors को serve करते हुए।
- req = उन्होंने क्या पूछा (req.url); res = आपका reply: writeHead, फिर write, फिर end।
- res.end() seal करके send करता है; इसे भूलना browser को हमेशा के लिए spinning छोड़ देता है।
- server.listen(8080) door खोलता है; http://localhost:8080 visit कीजिए (यह machine, वह port)।
- Code edits को server restart चाहिए; port clashes का मतलब है कोई दूसरा server वह door hold कर रहा है।
- Memory hook: require, create, listen: head, body, end।