Javascript 实现 HttpServer

摘要:

通过 Javascript实现在 Nodejs下运行的 web服务
// package.json
{
  "name": "app-ui",
  "version": "1.0.0",
  "description": "",
  "scripts": {
    "dev": "node ./server.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
//server.js
const http = require('http');
const fs = require('fs');
const path = require('path');


function staticServer(options) {
    const defaults = {
        hostname: "localhost",
        port: 3721,
        root: "./",
        index: "index.html",
        openBrowser: false
    }

    const settings = Object.assign({}, defaults, options);
    const server = http.createServer(function (request, response) {
        let pathname = request.url;
        const rootPath = path.join(__dirname, defaults.root, pathname);
        const filePath = path.join(rootPath, pathname.slice(-1) === '/' ? settings.index : "");
        if (fs.existsSync(filePath)) {
            try {
                const extname = path.extname(filePath);
                response.setHeader('Content-Type', getMimeType(extname));
                const raw = fs.createReadStream(filePath);
                response.writeHead(200, "OK");
                raw.pipe(response);
            } catch (err) {
                response.writeHead(500, { 'Content-Encodeing': 'text/plain' });
                response.end(err);
            }
        } else {
            response.writeHead(404, { 'Content-Encodeing': 'text/plain' });
            response.write("This request URL " + pathname + " was not found on this server.");
            response.end();
        }
    });



    const getMimeType = (extname) => {
        switch (extname) {
            case ".js":
                return "application/x-javascript;charset=UTF-8";
            case ".css":
                return "text/css;charset=UTF-8";
            case ".png":
                return "image/png";
            case ".gif":
                return "image/gif";
            case ".jpg":
            case ".jpeg":
                return "image/jpeg";
            case ".bmp":
                return "image/bmp";
            case "svg":
                return "image/svg+xml;charset=UTF-8";
            case ".pdf":
                return "application/pdf";
            case ".txt":
            case ".1og":
            case ".xml":
                return "text/plain;charset=UTF-8";
            case ".html":
            case ".htm":
                return "text/html;charset=UTF-8";
            default:
                return "application/octet-stream";
        }
    }

    const openDefaultBrowser = (url) => {
        const { exec } = require('child_process');
        switch (process.platform) {
            case "darwin":
                exec('open ' + url);
                break;
            case "win32":
                exec('start ' + url);
                break;
            default:
                exec('xdg-open', [url]);
        }
    }

    const { hostname, port, openBrowser } = settings;
    server.listen(port, hostname, () => {
        const url = `http://${hostname}:${port}`;
        openBrowser && openDefaultBrowser(url);
    })
}

staticServer({ openBrowser: true });
//在当前目录下执行  yarn dev 启动服务
  Javascript   HttpServer   web   js  

给我留言

个人介绍

about me

奕华

我不想成为一个庸俗的人。十年百年后,当我们死去,质疑我们的人同样死去,后人看到的是裹足不前、原地打转的你,还是一直奔跑、走到远方的我?

联系方式