前后端开发中简易设置个性化的Web代理服务器

简介: Node.js 项目开发调试时前端项目时通常需要提供web服务器,才能实现一些页面的功能调试。

使用 live-server


Node.js 项目开发调试时前端项目时通常需要提供web服务器,才能实现一些页面的功能调试。

因为如果通过file://协议访问html或js时,与相比 http://协议安全方面差别较大,file://访问文件时无法传递http协议头之类的东西,所以搭建web服务器成为了必须选项。

很多ide自动提供了这样的功能,如HBuilder. 自己搭建静态的web服务器也很容易,live-server这个node.js开发的软件就很好用。

live-server安装使用都很简单:

安装:

npm install -g live-server

使用:

live-server --port=9090

可以指定绑定的ip和端口号,也可以指定证书来配置对 https 协议的支持。live-server 能够自动监控文件变动从而自己重新加载页面,对前端开发来说非常方便。


搭建静态 Web 服务器


但也有一些情况下需要进行一些客户化设定,比如前后端分离项目,需要访问后端接口时,需要进行跨域的配置,如果使用代理方式的话,就可更加灵活的方式,而不必修改后端代码(因为这些修改常常是在正式发布后是不需要的,因为生产环境可能由网关完成跨域配置,或是同域的根本不需要跨域配置)。

这时自己能过简单的js文件完成一个代理的 web 服务器便很方便。

搭建一个可以访问静态文件的web服务器大体只需要以下的代码:

"use strict";
const fs = require('fs');
const path = require('path');
const http = require('http');
const url = require('url');
const PORT = 3000;
const args = process.argv
let staticBasePath = '../dist';
if(args.length>2)
   staticBasePath = args[2];
const staticServe = function(req, res) {
    const resolvedBase = path.resolve(staticBasePath);
    const safeSuffix = path.normalize(req.url).replace(/^(\.\.[\/\\])+/, '');
    const fileLoc = path.join(resolvedBase, safeSuffix);
    let pathname = url.parse(req.url).pathname;
    //根据url得到文件路径,读取文件并返回给客户端
    fs.readFile(fileLoc, function(err, data) {
        if (err) {
            res.writeHead(404, 'Not Found');
            res.write('404: File Not Found!');
            return res.end();
        }
        res.statusCode = 200;
        res.write(data);
        return res.end();
    });
};
const httpServer = http.createServer(staticServe);
httpServer.listen(PORT);

fs, http, path, url都是node.js自带的模块,在以上简单的情况下,不需要安装额外的模块即可实现对js,html,css,图片的静态文件的访问。


搭建支持后端接口的代理服务器


当需要同时访问静态文件和后端接口时,可以增加对http-proxy的支持,只需要在上面代码的基础上增加少量代码如下:

"use strict";
const fs = require('fs');
const path = require('path');
const http = require('http');
const url = require('url');
const PORT = 3000;
//npm install http-proxy --save-dev
// 用来代理部分请求到java
const httpProxy = require('http-proxy');
const proxy = httpProxy.createProxyServer({
     //后端服务的接口地址
    target: 'http://localhost:8080/',  
});
proxy.on('error', function(err, req, res){
    res.writeHead(500, {
        'content-type': 'text/plain'
    });
    console.log(err);
    res.end('Something went wrong. And we are reporting a custom error message.');
});
const args = process.argv
let staticBasePath = '../dist';
if(args.length>2)
   staticBasePath = args[2];
const staticServe = function(req, res) {
    const resolvedBase = path.resolve(staticBasePath);
    const safeSuffix = path.normalize(req.url).replace(/^(\.\.[\/\\])+/, '');
    const fileLoc = path.join(resolvedBase, safeSuffix);
    let pathname = url.parse(req.url).pathname;
    //判断如果是接口访问,则通过proxy转发
    //这里假设前端访问后端接口是通过 /gaming/xxx 来实现路由区分
    if(pathname.indexOf("gaming") > 0){
        proxy.web(req, res);
        return;
    }
    fs.readFile(fileLoc, function(err, data) {
        if (err) {
            res.writeHead(404, 'Not Found');
            res.write('404: File Not Found!');
            return res.end();
        }
        res.statusCode = 200;
        res.write(data);
        return res.end();
    });
};
const httpServer = http.createServer(staticServe);
httpServer.listen(PORT);


Mime 类型的使用示例


如果需要对特殊文件的支持,如 WebAssembly, 扩展名是.wasm,则需要在返回的Content-Type上做一下处理,即:

var mime = require('mime')
fs.readFile(fileLoc, function(err, data) {
        if (err) {
            res.writeHead(404, 'Not Found');
            res.write('404: File Not Found!');
            return res.end();
        }
        let extension = path.extname(fileLoc);
        let type =  mime.getType(fileLoc);
        if(type) {
            res.setHeader('Content-Type',type);
        }else if(extension=='.wasm'){
            res.setHeader('content-type', "application/wasm");
        }
        res.statusCode = 200;
        res.write(data);
        return res.end();
    });

这是因为前端加载 WebAssembly 里,浏览器要求必须按application/wasm 返回 content-type.

相关文章
|
7月前
|
移动开发 数据挖掘 开发者
服务器发送事件(SSE)在现代Web开发中的关键作用
服务器发送事件(SSE)是HTML5标准协议,用于服务器主动向客户端推送实时数据,适合单向通信场景。相比WebSocket,SSE更简洁高效,基于HTTP协议,具备自动重连、事件驱动等特性。常见应用场景包括实时通知、新闻推送、数据分析等。通过Apipost等工具可轻松调试SSE,助力开发者构建高效实时Web应用。示例中,电商平台利用SSE实现秒杀活动通知,显著减少延迟并简化架构。掌握SSE技术,能大幅提升用户体验与开发效率。
|
4月前
|
网络协议 Ubuntu
在Ubuntu 18.04/20.04 LTS设置静态DNS服务器的过程。
以上步骤提供了一种简洁明了的指导,让用户能够在Ubuntu系统中有效设置静态DNS服务器,这对日常管理和网络配置来说是非常实用的技能。
388 18
|
4月前
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
224 18
|
5月前
|
Ubuntu Linux 网络安全
在Linux云服务器上限制特定IP进行SSH远程连接的设置
温馨提示,修改iptables规则时要格外小心,否则可能导致无法远程访问你的服务器。最好在掌握足够技术知识和理解清楚操作含义之后再进行。另外,在已经配置了防火墙的情况下,例如ufw(Ubuntu Firewall)或firewalld,需要按照相应的防火墙的规则来设置。
268 24
|
4月前
|
数据采集 人工智能 BI
MyEMS能源管理系统后台配置-邮件服务器设置
本文介绍其邮件服务器配置方法。
55 0
|
7月前
|
存储 弹性计算 安全
阿里云服务器付费类型、地域、镜像、存储、带宽和安全组设置与选择注意事项参考
在我们通过自定义购买的方式购买阿里云服务器器ECS时,会有多个选项,有的新手用户可能并不是很清楚这些选项是什么,选择或设置时需要注意什么,本文将从付费类型、地域与可用区、镜像、存储、带宽和安全组等多个方面,为您详细解析云服务器购买过程中各个参数与配置的选择注意事项,以供参考。
432 66
|
11月前
|
缓存 监控 定位技术
|
6月前
|
前端开发 JavaScript 应用服务中间件
服务器如何设置可以提升网站打开速度?
首先关闭掉php版本中的输出详细错误信息功能;具体步骤为软件商店-对应php版本-设置-配置修改 找到“display_errors”参数,选择“关闭”保存即可。
131 0
|
6月前
|
Go API 定位技术
MCP 实战:用 Go 语言开发一个查询 IP 信息的 MCP 服务器
随着 MCP 的快速普及和广泛应用,MCP 服务器也层出不穷。大多数开发者使用的 MCP 服务器开发库是官方提供的 typescript-sdk,而作为 Go 开发者,我们也可以借助优秀的第三方库去开发 MCP 服务器,例如 ThinkInAIXYZ/go-mcp。 本文将详细介绍如何在 Go 语言中使用 go-mcp 库来开发一个查询 IP 信息的 MCP 服务器。
379 0
|
9月前
|
监控 前端开发 应用服务中间件
小游戏源码开发搭建技术栈和服务器配置流程
近些年不同场景游戏层出不穷,现就小游戏开发技术应用及功能详细剖析!