什么是静态资源服务器?
那先说什么是 静态资源 , 它指的是 不会被服务器的动态运行所改变或者生成的文件 . 它最初在服务器运行之前是什么样子, 到服务器结束运行时, 它还是那个样子. 比如平时写的 JS , CSS , html 文件, 都可以算是静态资源. 那么很容易理解, 静态资源服务器的功能就是向客户端提供静态资源.
话不多说, 开始写代码:
首先我们知道, 它先是一个 "服务器". 那根据上一章的所学, 我们要先用 http 模块创建一个 HTTP 服务器.
- var http = require('http');
- var server = http.createServer(function(req, res) {
- // 业务逻辑, 等会儿再写.
- });
- server.listen(3000, function() {
- console.log("静态资源服务器运行中.");
- console.log("正在监听 3000 端口:")
- })
url 模块
url 模块 - 文档
有了 HTTP 服务器之后, 我们就可以获取从客户端发过来的 HTTP 请求了.
请求报文中包含着请求 URL. 前文说过, URL 用于定位网络上的资源. 客户端通过 URL 来指明想要的服务器上资源. 那么服务器为了搞清楚客户端到底想要什么, 我们需要处理和解析 URL. 在 Node.JS 中, 我们使用 url 模块来完成这类操作.
我们知道 URL 字符串是具有结构的字符串, 包含多个意义不同的组成部分. 通过 url.parse() 函数, URL 字符串可以被解析为一个 URL 对象, 其属性对应于字符串的各组成部分. 如下图所示.
- var server = http.createServer(function(req, res) {
- var urlObj = url.parse(req.url);
- });
- var server = http.createServer(function(req, res) {
- var urlObj = url.parse(req.url);
- var urlPathname = urlObj.pathname;
- });
- var server = http.createServer(function(req, res) {
- var urlObj = url.parse(req.url);
- var urlPathname = urlObj.pathname;
- var filePathname = path.join(__dirname, "/public", urlPathname);
- });
- var server = http.createServer(function(req, res) {
- var urlObj = url.parse(req.url);
- var urlPathname = urlObj.pathname;
- var filePathname = path.join(__dirname, "/public", urlPathname);
- fs.readFile(filePathname, (err, data) => {
- // 如果有问题返回 404
- if (err) {
- res.writeHead(404);
- res.write("404 - File is not found!");
- res.end();
- // 没问题返回文件内容
- } else {
- res.writeHead(200);
- res.write(data);
- res.end();
- }
- })
- });
- text/plain
- text/HTML
- image/PNG
- var server = http.createServer(function(req, res) {
- var urlObj = url.parse(req.url);
- var urlPathname = urlObj.pathname;
- var filePathname = path.join(__dirname, "/public", urlPathname);
- // 解析后对象的 ext 属性中保存着目标文件的后缀名
- var ext = path.parse(urlPathname).ext;
- // 读取文件的代码...
- var mime = require('mime');
- var server = http.createServer(function(req, res) {
- var urlObj = url.parse(req.url);
- var urlPathname = urlObj.pathname;
- var filePathname = path.join(__dirname, "/public", urlPathname);
- // 解析后对象的 ext 属性中保存着目标文件的后缀名
- var ext = path.parse(urlPathname).ext;
- // 获取后缀对应的 MIME 类型
- var mimeType = mime.getType(ext);
- // 读取文件的代码...
- });
- var server = http.createServer(function(req, res) {
- // 代码省略...
- var mimeType = mime.getType(ext);
- fs.readFile(filePathname, (err, data) => {
- // 如果有问题返回 404
- if (err) {
- res.writeHead(404, { "Content-Type": "text/plain" });
- res.write("404 - File is not found!");
- res.end();
- // 没问题返回文件内容
- } else {
- // 设置好响应头
- res.writeHead(200, { "Content-Type": mimeType });
- res.write(data);
- res.end();
- }
- })
- });
- // readStaticFile.JS
- // 引入依赖的模块
- var path = require('path');
- var fs = require('fs');
- var mime = require('mime');
- function readStaticFile(res, filePathname) {
- var ext = path.parse(filePathname).ext;
- var mimeType = mime.getType(ext);
- // 判断路径是否有后缀, 有的话则说明客户端要请求的是一个文件
- if (ext) {
- // 根据传入的目标文件路径来读取对应文件
- fs.readFile(filePathname, (err, data) => {
- // 错误处理
- if (err) {
- res.writeHead(404, { "Content-Type": "text/plain" });
- res.write("404 - NOT FOUND");
- res.end();
- } else {
- res.writeHead(200, { "Content-Type": mimeType });
- res.write(data);
- res.end();
- }
- });
- // 返回 false 表示, 客户端想要的 是 静态文件
- return true;
- } else {
- // 返回 false 表示, 客户端想要的 不是 静态文件
- return false;
- }
- }
- // 导出函数
- module.exports = readStaticFile;
- // server.JS
- // 引入相关模块
- var http = require('http');
- var url = require('url');
- var path = require('path');
- var readStaticFile = require('./modules/readStaticFile');
- // 搭建 HTTP 服务器
- var server = http.createServer(function(req, res) {
- var urlObj = url.parse(req.url);
- var urlPathname = urlObj.pathname;
- var filePathname = path.join(__dirname, "/public", urlPathname);
- // 读取静态文件
- readStaticFile(res, filePathname);
- });
- // 在 3000 端口监听请求
- server.listen(3000, function() {
- console.log("服务器运行中.");
- console.log("正在监听 3000 端口:")
- })
来源: http://www.qdfuns.com/article/51116/2d1eca3ed1b010369ab2215b64e6b685.html