资讯专栏INFORMATION COLUMN

用 Node.js 搭建本地服务器

Crazy_Coder / 3413人阅读

摘要:服务器端在响应两种请求方式时,响应数据格式参考官方文档。关于热部署启动服务器时是将脚本放入内存,以后都会直接访问内存,避免重复载入。参考学习笔记用搭建一个简单的本地服务器热部署代码,实现动态调试,可以实现热更新

原文:https://zhictory.github.io/bl...

网友 bottle_ 提供搭建一个简单本地服务器的思路为下:

我们需要一个 HTTP 服务器

对于不同的请求,根据请求的 URL,我们的服务器需要给予不同的响应,因此我们需要一个路由,用于把请求对应到请求处理程序(request handler)

当请求被服务器接收并通过路由传递之后,需要可以对其进行处理,因此我们需要最终的请求处理程序

我们需要从 HTML 文件里提取数据以及展示服务器传入的数据,因此需要将 HTML 和服务器结合起来

index.js

引用模块

const fs = require("fs"); // 系统文件及目录进行读写操作
const http = require("http"); // 封装了高效的 HTTP 服务器和 HTTP 客户端
const url = require("url"); // URL 处理

路由

/**
* 路由
* @param {Function} handle 请求处理程序
* @param {String} pathname 路径
* @param {Object} response 响应数据
* @param {Object} postData 请求参数
*/
function route(handle, pathname, response, postData) {
  if (typeof handle[pathname] === "function") {
    handle[pathname](response, postData);
  } else {
    response.writeHead(404, { "Content-Type": "text/plain" });
    response.write("404 Not Found");
    response.end();
  }
}

服务器

/**
* 服务器
* @param {Function} route 路由
* @param {Function} handle 请求处理程序
*/
function start(route, handle) {
  function onRequest(request, response) {
    const pathname = url.parse(request.url).pathname;
    let postData = "";
    switch (request.method) {
      case "GET":
        postData += url.parse(request.url).query;
        request.setEncoding("utf8");
        route(handle, pathname, response, postData);
        break;
      case "POST":
        request.addListener("data", function (postDateChunk) {
          postData += postDateChunk;
        });
        request.addListener("end", function () {
          route(handle, pathname, response, postData);
        });
        break;
    };
  }

  http.createServer(onRequest).listen(8080);
  console.log("Server has started");
}

请求处理程序

// 请求处理程序
const handle = {
  // index 接口
  "/public/index.html": function (response, postData) {
    const pathname = __dirname + "/public/index.html";
    fs.readFile(pathname, function (err, data) {
      response.end(data);
    });
  },
  // download 接口
  "/download": function (response, postData) {
    response.writeHead(200, { "Content-Type": "text/html" });
    response.write(JSON.stringify({
      code: 200,
      data: {
        "time": new Date().toLocaleString("en-US")
      }
    }));
    response.end();
  },
  // upload 接口
  "/upload": function (response, postData) {
    response.writeHead(200, { "Content-Type": "text/html" });
    response.write("You have sent: " + JSON.parse(postData).value);
    response.end();
  }
};

启动服务器

// 启动服务器 = 路由处理 + 接口处理
start(route, handle);

index.html





  
  
  
  Document



  
  
  

关于 GET 和 POST 方式的请求参数

GET 的请求参数是以查询参数形式放在 URL 后面的,服务器可以从 URL 上获取参数:url.parse(request.url).query

POST 的请求参数则需要作为 xhr.send() 的参数并转换为字符串来传递,本文使用 JSON.stringify() 来转换,再在服务器端用 JSON.parse() 转换。

服务器端在响应两种请求方式时,响应数据格式参考官方文档。

关于服务器响应头中的 Content-Type

一般网站的做法是:当返回 HTML 页面时为 text/html,当使用 JSONP 时为 text/javascript,当使用 CORS 时为 application/json。

关于 Node.js 热部署

Node.js 启动服务器时是将脚本放入内存,以后都会直接访问内存,避免重复载入。这种设计虽然有利于提高性能,却不利于开发调试,导致修改 Node.js 代码后需要手动终止进程并重启才会生效。

网友 会奔跑的胖子 提出方案:

你只需要在修改文件后保存,它就能自动替你发布,这就是所谓的热部署。

supervisor 就是一个 Node.js 的开源热部署工具:

npm i supervisor -g
supervisor server.js

该网友还提到另一个开源热部署工具 hotcode,但经测试 hotcode 若使用 express 4.x 则会报错,因为 hotcode 使用的 express.createServer() 已经被废弃。

参考:
学习笔记:用Nodejs搭建一个简单的本地服务器
NodeJS”热部署“代码,实现动态调试(hotnode,可以实现热更新)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/94445.html

相关文章

  • Node.js 搭建本地HTTP务器并应node-http-proxy解决ajax跨域问题

    摘要:搭建本地服务器参考了的搭建本地服务器做转发使用实现,官方文档配置服务器和转发接口地址判断如果是接口访问,则通过转发这里参考的源码,补充了几个字体文件的。 起因:公司的产品更换前端框架,接口的访问原本是通过nginx配置反向代理实现的,本地没有安装nginx,就用node.js做一个。 node.js搭建本地http服务器参考了shawn.xie的《nodejs搭建本地http服务器》...

    binaryTree 评论0 收藏0
  • 如何在务器搭建hexo博客

    原文链接 随着Vateral主题的开发接近了尾声,在对主题速度优化的时候发现之前用的githubpage问题多多:首先就是因为在国内的原因,访问速度本身就很慢,曾经有次加载一张16kb的图标时间耗费了26s!!?其次,在对资源做CDN托管加速时,域名是需要备案的,显然githubpage也是做不了的;所以果断舍弃了这个把hexo搭建到了我的阿里云服务器上 总体来说还是比把hexo搭建到github...

    MycLambert 评论0 收藏0
  • 【实战】 express+MongoDB 搭建一个完整的前端项目

    摘要:前言要做一个全沾的工程师,对于后端和数据库来说,即使不认识也要见个面的。基本了解的概念就好,主要是安装上数据库,并进行简单的增删操作。 前言:要做一个全沾的工程师,对于后端和数据库来说,即使不认识也要见个面的。本文给的例子很简单,也贴出来源码,只要一步步下来,就可以跑起来啦~~~ 思考一个需求:做一个登录页面,自己搭建服务和数据库,将用户输入的登录信息保存到数据库如何完成呢:首先选择...

    Steve_Wang_ 评论0 收藏0
  • webpack从零开始搭建多页面(一):webpack起步到运行一个简单的demo

    摘要:文件夹用来存放供浏览器读取的文件,这个是打包成的文件。在文件下手动建立一个文件,并写入下面的代码。配置出口文件的地址在版本后,支持多出口配置。可以防止不同操作系统之间的文件路径问题,并且可以使用相对路径按照预期工作。 搭建webpack_demo1项目,使其运行起来 webpack的强大就不介绍了,我们直接动手做起来,我们从零开始一步步搭建一个多页面的系统,多参考webpack中文文档...

    EsgynChina 评论0 收藏0
  • nodejs搭建本地http务器

    摘要:然后找了个例子,都成功实现了,一个是自已写代码,要处理好多问题,比如我的网页是,是搞了半天装了个库安装编码转换结果可以运行了,中文路径的问题也搞定了,但是图片问题还没搞定,也变成了文字读取。 初学NODEJS,从网站下载了一个单文件的node.exe,简单JS测试可以了,但是需要用到一些库就完全不行了什么npm命令,输了都无效,想安装npm也不知咋弄后面下载了最新版本,安装的msi版本...

    fxp 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<