Day12 NodeJS-Web Server I

今天的目标是:用NodeJS练习写一个简单的Web Server,所以会先介绍一下NodeJS中的http模组,然後再来看看要如何让网页在客户端与服务器端传递。

http模组

NodeJS的http模组的来源是名为http_parser的C语言函式库,用於执行HTTP应用程序、处理请求(request)与回应(response),其中的createServer()方法用来建立Server,藉由回呼函式提供监听事件,在收到请求时处理请求内容及送出回应,而NodeJS中开发的程序码透过http模组,不仅可以回应HTTP请求,也可以用在提出HTTP请求。

Node中的Web Server

Web Server意为网页系统的服务器,透过HTTP接收、处理及传送网页或其他档案至客户端(通常为浏览器),这边会以NodeJS实作简易的Web Server。

写一个Server

  1. 引用http模组,并使用createServer()建立一个新的Server,createServer()参数为包含有请求req及回应res两个参数的回呼函式,在建立Server时要加上listen()以监听指定IP位址及埠,范例中IP位址127.0.0.1为本机localhost的IP,而埠可自行指定。
let http = require("http");

http.createServer(function(req, res){
  
}).listen(1324, "127.0.0.1");
  1. 设定回呼函式执行内容与回应内容,首先以writeHead()定义回应的Status和Headers,再以sendData()end()传送内容,若以end()回传内容则表示传送完之後便结束这个工作程序。
http.createServer(function(req, res){
  res.writeHead(200, {"Content-Type": "text/plain"});  //回应状态OK,资料类型MIME为纯文字
  res.end("Hello~\n");
}).listen(1324, "127.0.0.1");
  1. 执行除错时,程序会持续执行,等候浏览器传送请求,此时以浏览器连线Server监听IP位址,就会触发回呼函式回应文字内容。

https://ithelp.ithome.com.tw/upload/images/20210927/201399806AsemfZTjW.png

https://ithelp.ithome.com.tw/upload/images/20210927/201399800oIa6TMzBO.png

  1. 若在浏览器中开启开发者工具,可以从网路>localhost>Header看到请求的资讯及Response可以看到回应的内容。

https://ithelp.ithome.com.tw/upload/images/20210927/20139980oXhyLsELB9.png

https://ithelp.ithome.com.tw/upload/images/20210927/20139980ZOWe0I99C0.png

输出html

这部份提到的html输出包含静态的html页面及以placeholder保留变数在後续更新内容的html样板~

html

  1. 建立一个名为index.html的html档案。
<html>
    <head></head>
    <body>
        <h1>Hello To ITs</h1>
        <p>This is just an example</p>
    </body>
</html>
  1. 在主程序中引入http模组处理请求与回应,并引入fs模组以读取档案。
let http = require("http");
let fs = require("fs");
  1. 建立Server、监听指定位址,并设定回传内容。将html档案的内容以fs模组的功能读取为Buffer,再作为传送的回应内容,在Header的部份要将contentType设定为text/html以让执行引擎确认资料类型并转换,若设定为text/plain会直接以纯文字将html档案内容传送至浏览器。
http.createServer(function(req,res){
  let html = fs.readFileSync(`${__dirname}/index.html`);
  res.writeHead(200, {"contentType":"text/html"});
  res.end(html);
}).listen(1324,"127.0.0.1");
  1. 执行後以浏览器连线确认,html档案以网页物件呈现。

https://ithelp.ithome.com.tw/upload/images/20210927/201399808qgyCDfHtT.png

html样板

  1. 将html档案加入{DateMsg}参数作为placeholder。
<html>
  <head></head>
  <body>
    <h1>Hello To ITs</h1>
    <p>This is just an example</p>
    <p>{DateMsg}</p>	<!--加入placeholder-->
  </body>
</html>
  1. 在主程序部份,在readFileSync()方法加入编码参数,把html档案改以串流的方式读取,以便修改内容。
http.createServer(function(req,res){
  let html = fs.readFileSync(`${__dirname}/index.html`, "utf8");  //加入编码参数,html为Stream
  res.writeHead(200, {"contentType":"text/html"});
  res.end(html);
}).listen(1324,"127.0.0.1");
  1. 定义取代{DateMsg}的变数,更新html
http.createServer(function(req,res){
  let html = fs.readFileSync(`${__dirname}/index.html`, "utf8");  //加入编码参数,html为Stream
  let date = new Date();
  html = html.replace("{DateMsg}", date);
  res.writeHead(200, {"contentType":"text/html"});
  res.end(html);
}).listen(1324,"127.0.0.1");
  1. 执行後以浏览器确认,新增的变数顺利在html样板中呈现,藉由样板的概念可以让html在不同的请求下动态更新内容。

https://ithelp.ithome.com.tw/upload/images/20210927/20139980HeHmaj16uM.png

小结

过去在以C#为後端程序语言进行开发时,几乎不需要了解服务器执行的内容,因为微软的IIS实在太方便囧 虽然NodeJS创建Server的功能看似很容易也很有趣,但已经可以想像如果系统复杂度比较高的情况下,可能需要更多的时间去规划和维护,除了这些基础以後还是要再多尝试、探究。

参考资料

https://github.com/nodejs/http-parser

https://zh.wikipedia.org/wiki/网页服务器

https://nodejs.org/dist/latest-v16.x/docs/api/http.html

https://github.com/nodejs/http-parser

Learn and Understand NodeJS [课程]


<<:  EP 12 - [TDD] 设定环境变数

>>:  Day 12: Structural patterns - Bridge

Day 4 [Python ML] 模型验证

前言 今天要继续昨天做过的部分,因此一开始需要昨天的程序码 import pandas as pd ...

21.移转 Aras PLM大小事-回复料号

写这篇主要是提供那些动不动会改错料号 需要回复前一版料号,首先要知道如果关联是用float时 子阶料...

qt 自定义控件 不同萤幕

自定义了一个数字键盘: 自己电脑跑起来是正常的,但是切换到一个分辨率不一样的电脑时就跑掉了,不整齐;...

予焦啦!Hello World 与 Uart 机制观察

本节是以 Golang 上游 7ee4c1665477c6cf574cb9128deaf9d009...

Day 2 驼峰式命名法

第二天,我们在讲解基本语法之前,先讲一下我们变数在命名的时候会遇到的"驼峰式命名法&quo...