• [Nodejs]十分钟快速编写简单静态文件服务器


    学了几天Nodejs 后我又干上了前端的活。这次遇到的问题是,我想在不同的设备上方便的查看我编写的网页,很自然的就想到要是能在本地搭建一个简单的http服务器的话,那局域网内的所有设备都可以访问了,这可是极好的。于是趁热马上动手实现一个简单服务器。

    需求:访问http://192.168.1.100/index.html 可以返回指定网页及其涉及的资源(css,js,图片文件等)

    function start(route, handle) {
        http.createServer(function(request, response) {
    
            request.addListener("end", function(){
    
                fetchFile(request, response)
            })
    
        }).listen(8888);
    }

    调用createServer 方法创建一个服务器并监听8888端口,在回调内监听end 事件,并把抓取文件并返回的工作交给即将尚未编写的fetchFile 函数。

    var typeMap = {
        ".png" : "image/png",
        ".jpg" : "image/jpeg",
        ".js"  : "application/javascript",
        ".css" : "text/css",
        ".html" : "text/html"
    }

    接下来,在编写fetchFile 之前,我们需要一个 “后缀名->Conent-Type” 的表,这样在浏览器访问指定资源的时候,我们能返回响应的Content-Type。

    var fs = require('fs')
    function fetchFile(req, res) {
        var url = req.url
        fs.readFile("."+req.url, function(err, data) {
            var contentType = "text/plain"
            if (!err) {
                // find type of file
                for (key in typeMap) {
                    if (req.url.match(key)) {
                        contentType = typeMap[key]
                        break
                    }
                }
                res.writeHead(200, {"Content-Type": contentType})
                res.write(data)
                res.end()
            }
            else {
                res.writeHead(404, {"Content-Type":contentType})
                res.end()
            }
        })
    }

    最后一步,当我们收到一个请求的时候,只需把请求的url 拿出来,在typeMap 里找出响应的Content-Type,之后调用fs 模块的异步文件读取方法,

    • 如果文件存在,我们就返回正确的头信息,附上文件内容,发送响应。
    • 如果文件不存在,返回404状态码,结束响应。

    最后不要忘记调用我们的start 方法。

    完整代码:

    var http = require("http");
    
    function start(route, handle) {
        http.createServer(function(request, response) {
    
            request.addListener("end", function(){
                fetchFile(request, response)
            })
    
        }).listen(8888);
    }
    
    var typeMap = {
        ".png" : "image/png",
        ".jpg" : "image/jpeg",
        ".js"  : "application/javascript",
        ".css" : "text/css",
        ".html" : "text/html"
    }
    
    var fs = require('fs')
    function fetchFile(req, res) {
        var url = req.url
        fs.readFile("."+req.url, function(err, data) {
            var contentType = "text/plain"
            if (!err) {
                // find type of file
                for (key in typeMap) {
                    if (req.url.match(key)) {
                        contentType = typeMap[key]
                        break
                    }
                }
                res.writeHead(200, {"Content-Type": contentType})
                res.write(data)
                res.end()
            }
            else {
                res.writeHead(400, {"Content-Type":contentType})
                res.end()
            }
        })
    }
    
    start()
    server.js
  • 相关阅读:
    洛谷-P5734 【深基6.例6】文字处理软件
    洛谷-P5733 【深基6.例1】自动修正
    洛谷-P5730 【深基5.例10】显示屏
    洛谷-P2615 神奇的幻方
    栈和堆的狗屎笔记
    值类型和引用类型笔记(连接到栈和堆的芝士点)
    总结Linq或者lamdba的写法(2)
    安装VS和SQL的默认文件夹路径
    托管调试助手 "ContextSwitchDeadlock":“CLR 无法从 COM 上下文 0x2d59360 转换为 COM 上下文 0x2d592a8,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作。这种情况通常会影响
    超详细的Canal入门,看这篇就够了!
  • 原文地址:https://www.cnblogs.com/agentgamer/p/4378097.html
Copyright © 2020-2023  润新知