node.js
ขึ้นอยู่กับเอ็นจิ้น v8
ของ Chrome
เพื่อรันโค้ด js
ดังนั้นเราจึงสามารถกำจัดสภาพแวดล้อมของเบราว์เซอร์และรันโค้ด js
ได้โดยตรงในคอนโซล เช่น hello world
ต่อไปนี้ hello world
code
console.log('hello world');
คุณสามารถรันได้โดยตรงโดยใช้ node
ในคอนโซล
http
ในตัวของ node.js
มีความสามารถด้านบริการ http
ขั้นพื้นฐาน ตามข้อกำหนด CommonJS
เราสามารถใช้ require
เพื่อนำเข้าโมดูล http
เพื่อใช้งาน มีฟังก์ชัน createServer
ใน http
โมดูลที่ช่วยให้เราสามารถสร้าง http
เซิร์ฟเวอร์ได้รับฟังก์ชันการโทรกลับเป็นพารามิเตอร์ ฟังก์ชันการโทรกลับนี้ได้รับพารามิเตอร์สองตัว - request
response
request
url
header
เนื้อหาคำขอ การresponse
ส่วนใหญ่จะใช้เพื่อส่งคืนข้อมูลไปยังไคลเอนต์สรุปการดำเนินการบางอย่างที่เกี่ยวข้องกับเนื้อหาการตอบสนอง ตัวอย่างเช่น วิธี response.writeHead
ช่วยให้เราปรับแต่งข้อมูลส่วนหัวและรหัสสถานะของเนื้อหาที่ส่งคืนได้ เนื้อหาการตอบกลับเราเรียกเมธอด response.end()
คุณสามารถส่งเนื้อหาการตอบกลับไปยังไคลเอนต์ได้ การใช้ฟังก์ชัน createServer
จะสร้างเฉพาะวัตถุ Server
สำหรับเราเท่านั้น แต่ไม่ได้เปิดใช้งานเพื่อฟัง listen
Method ของ server
ที่จะ Listen เราสามารถเริ่มรัน
listen
Method ในฐานะเซิร์ฟเวอร์ได้ พารามิเตอร์แรกคือหมายเลขพอร์ตการฟัง พารามิเตอร์ตัวที่สองคือ ip
ของโฮสต์ที่ถูกผูกไว้ และพารามิเตอร์ที่สามคือฟังก์ชันการโทรกลับที่จะเป็นยกเว้น
http
ส่งมาจากพารามิเตอร์แรกของฟังก์ชันการโทรกลับ เราสามารถเลือกที่จะจัดการข้อยกเว้นเพื่อทำให้เซิร์ฟเวอร์ของเราแข็งแกร่งยิ่งขึ้นใช้โมดูล http
เพื่อสร้างเซิร์ฟเวอร์อย่างง่าย
const { createServer } = need('http' ); constHOST = 'localhost'; const พอร์ต = '8080'; เซิร์ฟเวอร์ const = createServer((req, resp) => { // พารามิเตอร์แรกคือรหัสสถานะที่ส่งคืน // และพารามิเตอร์ตัวที่สองคือข้อมูลส่วนหัวของการตอบกลับ resp.writeHead(200, { 'ประเภทเนื้อหา': 'ข้อความ/ธรรมดา' }); console.log('เซิร์ฟเวอร์กำลังทำงาน...'); // วิธีการวางสายเพื่อแจ้งให้เซิร์ฟเวอร์ทราบว่าคำขอได้รับการตอบสนองแล้ว resp.end('สวัสดี nodejs http เซิร์ฟเวอร์'); - server.listen (พอร์ต, โฮสต์, (ข้อผิดพลาด) => { ถ้า (ข้อผิดพลาด) { console.log('มีบางอย่างผิดปกติ:', ข้อผิดพลาด); กลับ; - console.log(`เซิร์ฟเวอร์กำลังฟังบน http://${HOST}:${PORT} ...`); });
คุณสามารถลองรันด้วย node
และสร้างเซิร์ฟเวอร์ของคุณเองได้โดยตรง! หลังจากที่เซิร์ฟเวอร์ทำงาน เบราว์เซอร์จะสามารถเข้าถึงเซิร์ฟเวอร์ได้โดยการเข้าถึง http://localhost:8080
คุณยังสามารถใช้ nodemon
เพื่อรันมันได้ ดังนั้นเมื่อโค้ดของเราเปลี่ยนแปลง เราไม่จำเป็นต้องยุติโปรแกรมด้วยตนเองและรัน
npm i -g nodemonอีก
ครั้ง ขอแนะนำให้ติดตั้งมันทั่วโลกเพื่อให้คุณสามารถใช้งานได้โดยตรง โดยไม่ต้องใช้ npx nodemon
นอกจากนี้ยังง่ายมากเพียงเปลี่ยนคำสั่ง node
เป็นคำสั่ง nodemon
nodemon http-server.js
เมื่อเราใช้ createServer
และ resp
object ก่อนหน้านี้ เราไม่เห็น syntax prompts ใดๆ เลย เราต้องปฏิบัติตามเอกสารประกอบ node
อย่างเป็นทางการเพื่อตรวจสอบได้ตลอดเวลา มันไม่สะดวกสักหน่อย สามารถใช้ .d.ts
ช่วยให้เราจัดเตรียมฟังก์ชันพร้อมต์ไวยากรณ์ โปรดทราบว่าเราไม่ได้ใช้ ts
เพื่อการพัฒนา แต่ใช้ฟังก์ชันพร้อมต์ไวยากรณ์
npm init -y
@types/node
-- pnpm i @types/node -D
jsconfig.json
ในไดเร็กทอรีโปรเจ็กต์ ไม่รวม node_modules
ไม่จำเป็นต้องตรวจสอบ{ "compilerOptions": { "checkJs": จริง - "แยก": ["node_modules", "**/node_modules/*"] }
ฉันสงสัยว่าคุณได้ค้นพบว่ามีข้อผิดพลาดในโค้ดข้างต้นหรือไม่? checkJs
สามารถช่วยเราตรวจสอบข้อผิดพลาดประเภทได้ คุณสามารถเลือกได้ว่าจะเปิดตามความต้องการของคุณหรือไม่ หลังจากเปิดการตรวจสอบแล้ว ระบบจะแจ้งเราทันทีเกี่ยวกับประเภทพารามิเตอร์ที่ไม่ตรงกัน
ในขณะนี้ ให้เลื่อนเมาส์ไปเหนือวิธี listen
และคุณจะเห็นลายเซ็นของวิธีการดังกล่าว
อย่างที่คุณเห็น พารามิเตอร์ port
ดั้งเดิมจะต้องเป็นประเภท number
แต่เมื่อเรากำหนดไว้ มันเป็นประเภท string
ดังนั้นจึงไม่ตรงกัน เพียงเปลี่ยนเป็น 8080
ของ number
และคุณสามารถดูเอกสาร api
ที่เกี่ยวข้องได้โดยตรง โดยไม่ต้องเปิด node
อย่างเป็นทางการ ฉันใช้เวลานานในการค้นหาเอกสารและตรวจสอบ
http server
แบบธรรมดาของเราส่งคืนประโยคเดียวเท่านั้น เป็นไปได้ไหมที่จะส่งคืนหลายประโยค สิ่งนี้ต้องใช้วิธี write
ของวัตถุ resp
end
สามารถส่งคืนเนื้อหา write
เพียงครั้งเดียว แต่เราสามารถเขียนเนื้อหา end
ในเนื้อหาการตอบกลับได้หลายครั้ง ส่งพารามิเตอร์ใด ๆ ให้เขาทำหน้าที่ส่งเนื้อหาการตอบกลับ
const { createServer } = need("http"); constHOST = "localhost"; const พอร์ต = 8080; เซิร์ฟเวอร์ const = createServer((req, resp) => { resp.writeHead(200, { "ประเภทเนื้อหา": "ข้อความ/ธรรมดา" }); console.log("เซิร์ฟเวอร์กำลังทำงาน..."); // เขียนประโยคลอเร็มบางส่วน resp.write("Lorem ipsum dolor นั่ง amet consectetur adipisicing elit.n"); resp.write("Omnis eligendi aperiam delectus?n"); resp.write("Aut, quam quo!n"); ตอบกลับสิ้นสุด(); - server.listen (พอร์ต, โฮสต์, (ข้อผิดพลาด) => { ถ้า (ข้อผิดพลาด) { console.log("มีบางอย่างผิดปกติ: ", ข้อผิดพลาด); กลับ; - console.log(`เซิร์ฟเวอร์กำลังฟังบน http://${HOST}:${PORT} ...`); });
คราวนี้เราเขียนไปสามประโยค และตอนนี้เอฟเฟกต์ก็กลายเป็นแบบนี้
เราไม่เพียงสามารถส่งคืนสตริงไปยังเบราว์เซอร์เท่านั้น แต่ยังอ่านเนื้อหาของไฟล์ html
โดยตรงและส่งคืนไปยังเบราว์เซอร์ด้วยเหตุนี้จึงต้องใช้โมดูลในตัว Node.js
อื่น - fs
ซึ่งโมดูลมีฟังก์ชันการทำงานของไฟล์ คุณสามารถใช้ fs.readFile
เพื่ออ่านไฟล์แบบอะซิงโครนัสได้ แต่จะไม่ส่งคืนอ็อบเจ็กต์ promise
ดังนั้นเราจึงจำเป็นต้องส่งผ่านการโทรกลับเพื่อจัดการการดำเนินการหลังจากอ่านไฟล์คุณ นอกจากนี้ยังสามารถใช้ fs.readFileSync
การบล็อกการอ่านไฟล์แบบซิงโครนัส ที่นี่เราเลือกการอ่านแบบอะซิงโครนัส
const { createServer } = need("http"); const fs = ต้องการ("fs"); constHOST = "localhost"; const PORT = 8080; เซิร์ฟเวอร์ const = createServer ((req, resp) => { // เปลี่ยนประเภท MIME จาก text/plain เป็น text/html resp.writeHead(200, { "ประเภทเนื้อหา": "ข้อความ/html" }); // อ่านเนื้อหาไฟล์ html fs.readFile("index.html", (ผิดพลาด, ข้อมูล) => { ถ้า (ผิดพลาด) { คอนโซล.ข้อผิดพลาด( "เกิดข้อผิดพลาดขณะอ่านเนื้อหาไฟล์ html:", ผิดพลาด ); โยนผิด; - console.log("การดำเนินการสำเร็จ!"); resp.write(ข้อมูล); ตอบกลับสิ้นสุด(); - - server.listen (พอร์ต, โฮสต์, (ข้อผิดพลาด) => { ถ้า (ข้อผิดพลาด) { console.log("มีบางอย่างผิดปกติ: ", ข้อผิดพลาด); กลับ; - console.log(`เซิร์ฟเวอร์กำลังฟังบน http://${HOST}:${PORT} ...`); });
ผลลัพธ์ปัจจุบันจะเป็นดังนี้:
ส่งคืน html
สำเร็จ หมายเหตุ: ที่นี่คุณต้อง เปลี่ยน **Content-Type**
ของส่วนหัวการตอบกลับ เป็น **text/html**
เพื่อแจ้งให้เบราว์เซอร์ทราบว่าเรากำลังส่งคืน เนื้อหาของ ไฟล์ **html**
หากคุณยังคงใช้ **text/plain**
เบราว์เซอร์จะไม่แยกวิเคราะห์เนื้อหาที่ส่งคืน แม้ว่าจะสอดคล้องกับ ไวยากรณ์ **html**
แต่ก็จะไม่ถูกแยกวิเคราะห์ เช่นเดียวกับต่อไปนี้:
เมื่อเราต้องการเขียนเซิร์ฟเวอร์แบ็คเอนด์ที่รับผิดชอบในการส่งคืนข้อมูลอินเทอร์เฟซเท่านั้น เราจำเป็นต้องส่งคืนเนื้อหาในรูปแบบ json
ฉันเชื่อว่าคุณฉลาดและรู้วิธีจัดการ:
MIME
เป็น application/json
resp.write
สตริง json
จะถูกส่งผ่านไป คุณสามารถใช้ JSON.stringify
เพื่อประมวลผลอ็อบเจ็กต์และส่งคืนconst { createServer } = need("http"); constHOST = "localhost"; const พอร์ต = 8080; เซิร์ฟเวอร์ const = createServer((req, resp) => { // เปลี่ยนประเภท MIME เป็น application/json resp.writeHead(200, { "ประเภทเนื้อหา": "application/json" }); // สร้างข้อมูล json โดยใช้วัตถุ const jsonDataObj = { รหัส: 0, ข้อความ: "ความสำเร็จ", ข้อมูล: { ชื่อ: "ดินน้ำมัน" อายุ: 20, งานอดิเรก: "เขียนโค้ด", - - resp.write(JSON.stringify(jsonDataObj)); ตอบกลับสิ้นสุด(); - server.listen (พอร์ต, โฮสต์, (ข้อผิดพลาด) => { ถ้า (ข้อผิดพลาด) { console.log("มีบางอย่างผิดปกติ: ", ข้อผิดพลาด); กลับ; - console.log(`เซิร์ฟเวอร์กำลังฟังบน http://${HOST}:${PORT} ...`); });
ผลลัพธ์มีดังนี้:
แนวคิดในการส่งคืนไฟล์ pdf นั้นคล้ายกับการส่งคืนไฟล์ html
มาก่อน เป็นทั้งกระบวนการตั้งค่าประเภท MIME
ของส่วนหัวการตอบกลับ การอ่านไฟล์ และการส่งคืนเนื้อหาไฟล์ แต่ครั้งนี้เราทำ แนวคิดของเราคือทำในขณะที่เซิร์ฟเวอร์กำลังทำงานอยู่ หากต้องการสร้างไฟล์ pdf
และส่งคืน คุณต้องเปลี่ยนประเภท MIME
เป็น application/pdf
หากต้องการสร้างไฟล์ pdf
คุณต้องใช้ไลบรารี - pdfkit
pnpm i pdfkit
ก่อนอื่นเราเขียนฟังก์ชันเพื่อสร้างไฟล์ pdf
เนื่องจากการสร้างไฟล์ pdf
ยังต้องมีการดำเนินการเขียนบางอย่างซึ่งไม่แน่ใจว่าจะเสร็จสมบูรณ์เมื่อใด แต่คำขอของเราต้องรอจนกว่าไฟล์ pdf
จะถูกสร้างขึ้นก่อนจึงจะสามารถทำได้ ได้รับการตอบกลับ ดังนั้นเราจึงต้องทำให้เป็นแบบอะซิงโครนัสและคืน promise
/** * @description สร้างไฟล์ pdf */const createPdf = () => { คืนสัญญาใหม่ ((แก้ไข, ปฏิเสธ) => { ถ้า (!fs.existsSync("example.pdf")) { // สร้างวัตถุ PDFDocument const doc = PDFDocument ใหม่ (); // สร้างกระแสการเขียนโดยการไพพ์เนื้อหา pdf doc.pipe(fs.createWriteStream("example.pdf")); // เพิ่มเนื้อหาบางส่วนลงในเอกสาร pdf doc.fontSize(16).text("สวัสดี PDF", 100, 100); // เสร็จสิ้นการดำเนินการสร้างไฟล์ PDF doc.end(); - แก้ไข ("ความสำเร็จ"); - };
การดำเนินการไปป์ไลน์ถูกใช้ที่นี่เพื่อถ่ายโอนเนื้อหาของออบเจ็กต์ PDFDocument
ไปยังสตรีมการเขียนที่สร้างขึ้นใหม่ผ่านไปป์ไลน์ เมื่อการดำเนินการเสร็จสิ้น เราจะแจ้งให้โลกภายนอกทราบผ่าน resovle
ว่ามีการสร้างไฟล์ pdf
แล้วจึงเรียก
const เซิร์ฟเวอร์ในรหัสเซิร์ฟเวอร์ = createServer(async (req, resp) => { // เปลี่ยนประเภท MIME เป็น application/pdf resp.writeHead(200, { "ประเภทเนื้อหา": "application/pdf" }); // สร้างไฟล์ pdf รอ createPdf(); // อ่านไฟล์ pdf ที่สร้างขึ้น fs.readFile("example.pdf", (ผิดพลาด, ข้อมูล) => { ถ้า (ผิดพลาด) { คอนโซล.ข้อผิดพลาด( "เกิดข้อผิดพลาดขณะอ่านเนื้อหาไฟล์ pdf: ", ผิดพลาด - โยนผิดพลาด; - console.log("การดำเนินการสำเร็จ!"); resp.end(ข้อมูล); - - server.listen (พอร์ต, โฮสต์, (ข้อผิดพลาด) => { ถ้า (ข้อผิดพลาด) { console.log("มีบางอย่างผิดปกติ: ", ข้อผิดพลาด); กลับ; - console.log(`เซิร์ฟเวอร์กำลังฟังบน http://${HOST}:${PORT} ...`); });
ขณะนี้เบราว์เซอร์สามารถอ่านไฟล์ pdf
ที่สร้างขึ้นได้
ยังคงเหมือนเดิม อ่านไฟล์เสียง แล้วส่งไปยังวัตถุ resp
ผ่านทางไปป์ไลน์แล้วส่ง
คืน const { stat, createReadStream } = ต้องการ ("fs"); constHOST = "localhost"; const พอร์ต = 8080; เซิร์ฟเวอร์ const = createServer((req, resp) => { // เปลี่ยนประเภท MIME เป็น audio/mpe resp.writeHead(200, { "ประเภทเนื้อหา": "เสียง/mp3" }); const mp3FileName = "audio.mp3"; สถิติ (mp3FileName, (ผิดพลาด, สถิติ) => { ถ้า (stats.isFile()) { const rs = createReadStream(mp3FileName); // ไพพ์สตรีมการอ่านเพื่อตอบสนอง rs.pipe(ตอบกลับ); } อื่น { resp.end("ไม่มีไฟล์ mp3"); - - - server.listen (พอร์ต, โฮสต์, (ข้อผิดพลาด) => { ถ้า (ข้อผิดพลาด) { console.log("มีบางอย่างผิดปกติ: ", ข้อผิดพลาด); กลับ; - console.log(`เซิร์ฟเวอร์กำลังฟังบน http://${HOST}:${PORT} ...`); });
เอฟเฟกต์มีดังนี้
หลังจากเปิดขึ้นมาจะมีอินเทอร์เฟซสำหรับเล่นเสียง นี่คือการแสดงไฟล์เสียงที่มาจาก chrome
เมื่อคุณเปิดคอนโซลคุณจะพบว่ามีไฟล์เสียงกลับมา
หมายเหตุ: หลังจากส่งสตรีมไฟล์เสียงไปยัง **resp**
ผ่านไพพ์ แล้ว ไม่จำเป็นต้องเรียกใช้ เมธอด **resp.end()**
เนื่องจากจะเป็นการปิดการตอบกลับทั้งหมดและทำให้ไฟล์เสียงเสียหาย ไม่พร้อมใช้งาน
การประมวลผลไฟล์วิดีโอและไฟล์เสียงจะเหมือนกัน ยกเว้นว่าจะต้องเปลี่ยนประเภท MIME
เป็น video/mp4
ส่วนอย่างอื่นจะเหมือนกัน
const { createServer } = need("http"); const { stat, createReadStream } = ต้องการ ("fs"); constHOST = "localhost"; const พอร์ต = 8080; เซิร์ฟเวอร์ const = createServer((req, resp) => { // เปลี่ยนประเภท MIME เป็น audio/mpe resp.writeHead(200, { "ประเภทเนื้อหา": "เสียง/mp4" }); const mp4FileName = "วิดีโอ.mp4"; สถิติ (mp4FileName, (ผิดพลาด, สถิติ) => { ถ้า (stats.isFile()) { const rs = createReadStream(mp4FileName); // ไพพ์สตรีมการอ่านเพื่อตอบสนอง rs.pipe(ตอบกลับ); } อื่น { resp.end("ไม่มีไฟล์ mp4"); - - - server.listen (พอร์ต, โฮสต์, (ข้อผิดพลาด) => { ถ้า (ข้อผิดพลาด) { console.log("มีบางอย่างผิดปกติ: ", ข้อผิดพลาด); กลับ; - console.log(`เซิร์ฟเวอร์กำลังฟังบน http://${HOST}:${PORT} ...`); -
เราได้เรียนรู้:
html
Node
http
JSON
pdf
js
แม้ว่าเนื้อหาจะเรียบง่าย แต่ฉันก็ยังหวังว่าคุณจะทำตามและลองดูสิ อย่าคิดว่ามันง่ายเลย ไม่ได้หมายความว่าคุณรู้ คุณจะพบกับปัญหาของคุณเองหลังจากที่คุณนำไปใช้จริงเท่านั้น