Skip to content

http

http เป็นโมดูลในตัวของ Node.js ที่ให้ความสามารถในการสร้าง HTTP server และ client สำหรับการสื่อสารผ่านโปรโตคอล HTTP/HTTPS

import { createServer, request, get } from 'node:http';

APIคำอธิบายลักษณะคำอธิบายเพิ่มเติม
createServerสร้าง HTTP serverAsynchronousใช้รับและจัดการ HTTP requests
requestสร้าง HTTP client requestAsynchronousสำหรับส่ง HTTP requests ไปยัง server อื่น
getส่ง HTTP GET requestAsynchronousเหมาะสำหรับการส่ง GET requests ที่ไม่ซับซ้อน
ServerClass สำหรับ HTTP serverAsynchronousใช้จัดการ connection และ requests
IncomingMessageClass สำหรับรับข้อมูล requestAsynchronousใช้อ่านข้อมูลจาก client (server) หรือ response จาก server (client)
ServerResponseClass สำหรับส่ง responseAsynchronousใช้เขียน response กลับไปยัง client

ตัวอย่าง

สร้าง HTTP Server พื้นฐาน

js
import { createServer } from "http";

// สร้าง HTTP server
const server = createServer((req, res) => {
  // ตั้งค่า header
  res.setHeader("Content-Type", "text/plain");

  // ตรวจสอบ URL path
  if (req.url === "/") {
    res.statusCode = 200;
    res.end("Hello, World!");
  } else if (req.url === "/about") {
    res.statusCode = 200;
    res.end("About Page");
  } else {
    res.statusCode = 404;
    res.end("Page Not Found");
  }
});

// เริ่มฟังที่ port 3000
server.listen(3000, () => {
  console.log("Server running at http://localhost:3000/");
});

สร้าง HTTP Client

js
import { get } from "http";

// ส่ง GET request ไปยังเว็บไซต์
const req = get("http://www.example.com", (res) => {
  let data = "";

  // รับข้อมูล response
  res.on("data", (chunk) => {
    data += chunk;
  });

  // เมื่อรับข้อมูลครบ
  res.on("end", () => {
    console.log(`Status Code: ${res.statusCode}`);
    console.log("Headers:", res.headers);
    console.log("Body:", data.slice(0, 100) + "..."); // แสดงแค่ส่วนต้น
  });
});

// จัดการ error
req.on("error", (err) => {
  console.error("Request Error:", err);
});

สร้าง REST API อย่างง่าย

js
import { createServer } from "http";

const server = createServer((req, res) => {
  // ตั้งค่า CORS headers
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader("Content-Type", "application/json");

  // ตรวจสอบ method และ path
  if (req.method === "GET" && req.url === "/api/users") {
    const users = [
      { id: 1, name: "John Doe" },
      { id: 2, name: "Jane Smith" },
    ];

    res.statusCode = 200;
    res.end(JSON.stringify(users));
  } else if (req.method === "POST" && req.url === "/api/users") {
    let body = "";

    // รับข้อมูลจาก client
    req.on("data", (chunk) => {
      body += chunk.toString();
    });

    // เมื่อรับข้อมูลครบ
    req.on("end", () => {
      const newUser = JSON.parse(body);
      console.log("Received new user:", newUser);

      res.statusCode = 201;
      res.end(JSON.stringify({ message: "User created", user: newUser }));
    });
  } else {
    res.statusCode = 404;
    res.end(JSON.stringify({ error: "Not Found" }));
  }
});

server.listen(3000, () => {
  console.log("REST API running at http://localhost:3000");
});

ใช้ Stream สำหรับไฟล์ขนาดใหญ่

js
import { createReadStream } from "fs";
import { stat } from "fs/promises";
import { createServer } from "http";

const server = createServer(async (req, res) => {
  try {
    const filePath = "./large-file.pdf";
    const stats = await stat(filePath);

    res.setHeader("Content-Type", "application/pdf");
    res.setHeader("Content-Length", stats.size);

    // ส่งไฟล์แบบ stream
    const stream = createReadStream(filePath);
    stream.pipe(res);

    stream.on("error", (err) => {
      res.statusCode = 500;
      res.end("File Error");
    });
  } catch (err) {
    res.statusCode = 404;
    res.end("File Not Found");
  }
});

server.listen(3000);

ส่ง POST Request ด้วยข้อมูล JSON

js
import { request } from "http";

// ข้อมูลที่จะส่ง
const postData = JSON.stringify({
  title: "foo",
  body: "bar",
  userId: 1,
});

// ตั้งค่า options สำหรับ request
const options = {
  hostname: "jsonplaceholder.typicode.com",
  port: 80,
  path: "/posts",
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Content-Length": postData.length,
  },
};

// สร้าง request
const req = request(options, (res) => {
  let data = "";

  res.on("data", (chunk) => {
    data += chunk;
  });

  res.on("end", () => {
    console.log("Response:", JSON.parse(data));
  });
});

// จัดการ error
req.on("error", (err) => {
  console.error("Request Error:", err);
});

// เขียนข้อมูลและส่ง request
req.write(postData);
req.end();