详解从NodeJS搭建中间层再谈前后端分离

yizhihongxing

详解从NodeJS搭建中间层再谈前后端分离

前言

随着前后端分离的流行,前端在项目中的地位越来越重要。在这个过程中,前端负责视觉交互和实现与用户交互相关的逻辑,而后端主要负责数据存储和提供API服务。但是由于前后端完全分离,在跨域等问题上会遇到很多麻烦。而中间件的出现可以很好地解决这个问题。本篇文章将详解如何使用NodeJS搭建一个中间层,来达成前后端分离的需求。

什么是中间层

中间层可以简单理解为前后端的桥梁,它坐落在前端与后端之间,接收并处理前端请求,再将请求转发到后端服务。中间层的优点在于:

  • 可以降低数据库等敏感资源的风险,如加入身份验证等安全机制;
  • 可以缓存,减轻后端压力;
  • 可以做数据聚合和转换;
  • 可以解决跨域等问题。

中间层搭建流程

1. 安装NodeJS

Node.js是一个基于Chrome V8引擎的JavaScript运行环境,可以让JavaScript脱离浏览器来运行。要使用NodeJS搭建中间层,首先需要在机器上安装NodeJS。安装过程可以参考Node官网的说明:https://nodejs.org/en/download/。

2. 初始化项目

创建一个文件夹,使用命令行进入该文件夹,运行npm init,根据提示输入项目名称、作者等信息,生成package.json文件。这个文件是npm包管理工具的配置文件,里面记录了该项目依赖的库等信息。

3. 导入所需模块

在项目根目录下创建app.js文件,并导入必要的模块:

var express = require('express');
var path = require('path');
var proxy = require('http-proxy-middleware');

其中,express是一个NodeJS框架,可以简化Web应用的开发。path用于路径处理,http-proxy-middleware是一个轻量级HTTP代理中间件。

4. 配置静态资源服务

app.use(express.static(path.join(__dirname, 'public')));

以上代码会将public目录下的静态资源作为服务提供给客户端。

5. 配置代理转发

app.use('/api', proxy({ target: 'http://localhost:3000', changeOrigin: true }));

以上代码实现了对/api路径的请求代理转发到http://localhost:3000。其中,changeOrigin为true表示在代理请求中,将请求的源设置为代理的源,解决跨域问题。

6. 启动中间层服务

var port = process.env.PORT || 8080;
app.listen(port, function () {
  console.log('Middlewares proxy listening on port ' + port);
});

以上代码会在指定端口(默认为8080)启动中间层服务,并在控制台打印监听启动消息。

7. 使用中间层服务

修改前端代码,将原本向后端请求数据的URL改为中间层服务提供的URL即可,如:

axios.get('/api/data')

示例说明

示例1:简单代理

以下示例基于前后端分离简单示例,在Vue项目中加入中间层。

  1. 假设后端API服务运行在http://localhost:3000,前端Vue项目使用webpack-dev-server启动在http://localhost:8080
  2. 创建一个中间层项目,并使用上文中提到的方法配置中间层。
  3. 修改Vue项目中所有向后端API请求的URL,改为/api/data(例如:axios.get('/api/data'))。
  4. 启动中间层和Vue项目,并在浏览器中访问Vue项目。

此时,Vue项目向中间层发送请求,中间层将请求转发至后端API服务,再将后端API的响应返回给Vue项目。此过程中,中间层实现了跨域,Vue项目和后端API之间无需相互认证。

示例2:数据聚合

以下示例在示例1基础上进行扩展,通过中间层实现数据聚合,从而降低了大量重复请求带来的服务器压力。

  1. 在远程API服务中增加一项API,用于返回所有用户名的列表,路径为/api/users
  2. 修改中间层代码,使用request模块发起对/api/users的请求,并将返回的用户名列表作为参数填入/api/data的请求数据中(这里使用了qs模块,用于序列化JavaScript对象):
var request = require('request');
var qs = require('qs');

app.get('/api/data', function(req, res) {
  request('http://localhost:3000/api/users', function (error, response, body) {
    if (!error && response.statusCode == 200) {
      var data = qs.stringify({
        users: JSON.parse(body),
      });
      request.post('http://localhost:3000/api/data', {body: data}, function (error, response, body) {
        res.json(JSON.parse(body));
      });
    }
  });
});
  1. Vue项目中修改请求地址为/api/data,并重新启动服务。

此时,Vue项目只需向中间层请求数据,中间层将根据需求,先请求所有用户名列表,再请求数据具体内容,最后将数据返回给Vue项目。这样,当页面中需要使用多个数据接口的数据时,只需要向中间层发送一个请求即可,避免了向后端不必要的重复请求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解从NodeJS搭建中间层再谈前后端分离 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • Express之托管静态文件的方法

    下面我将为您详细讲解关于 Express 中托管静态文件的方法。 Express 托管静态文件的方法 在 Express 中,我们可以使用 express.static 中间件来托管静态文件。express.static 模块的作用是将一个或多个目录指派为包含静态资产的目录,这些资产将直接送至客户端。 使用方式 我们可以通过如下方式使用 express.st…

    node js 2023年6月9日
    00
  • Node.js assert断言原理与用法分析

    Node.js Assert断言原理与用法分析 什么是断言? 断言是一种在运行时检测程序是否有误的方法。在编写测试程序时,测试程序会在特定条件下断言程序行为是否合乎预期。如果行为不如预期,则断言会抛出异常来指示错误。断言一般用于测试程序的健壮性以及程序的正确性。 Node.js assert模块 在Node.js中,可以使用内置的assert模块来实现断言。…

    node js 2023年6月8日
    00
  • node.js中路由,中间件,get请求和post请求的参数详解

    这里给出一个完整的攻略,分为以下几个方面: 路由 路由(Routing)是实现不同URL请求的分发处理,将不同的请求分配到对应的处理程序中,以便实现特定的功能。 在Node.js中,路由可以使用自带的模块http中的createServer方法来实现,通过request对象中的url和method属性可以获取当前请求的URL和请求方法,并根据不同的URL和请…

    node js 2023年6月8日
    00
  • Node.js之网络通讯模块实现浅析

    Node.js之网络通讯模块实现浅析 简介 Node.js是基于V8引擎的JavaScript运行环境,它具有事件驱动、异步I/O等特点,使其成为一个非常适合构建高性能网络应用程序的工具。Node.js提供了许多用于处理网络通讯的模块,本文将对其中的几个模块进行浅析,介绍它们的用途和实现方法。 net模块 net模块是Node.js中用于处理TCP网络通讯的…

    node js 2023年6月8日
    00
  • 常见的JavaScript内存错误及解决方法

    以下是详细的攻略: 常见的JavaScript内存错误及解决方法 在编写JavaScript代码时,会经常遇到一些内存错误。这些错误往往会导致程序崩溃,甚至发生安全漏洞。本文将介绍一些常见的JavaScript内存错误及其解决方法。 1. 内存泄漏 内存泄漏是指程序在使用完内存后没有释放,导致内存资源浪费。JavaScript作为一种解释性语言,垃圾回收机制…

    node js 2023年6月8日
    00
  • node.js中的fs.rename方法使用说明

    当我们需要在Node.js中重命名或移动文件时,可以使用fs.rename()方法来实现。该方法属于文件操作相关的模块fs(File System)中的方法之一。使用fs.rename()方法可以将一个已存在的文件重命名或者移动到指定目录。 fs.rename()方法使用说明 语法: fs.rename(oldPath, newPath, callback)…

    node js 2023年6月8日
    00
  • JavaScript正则表达式匹配 div style标签

    想要使用正则表达式来匹配HTML中的<div>、<style>标签,可以按照以下步骤进行: 创建正则表达式对象 const regExp = /<div.*?>([\s\S]*?)<\/div>|<style.*?>([\s\S]*?)<\/style>/gi; 这个正则表达式使用了|符…

    node js 2023年6月8日
    00
  • Node.js 实现远程桌面监控的方法步骤

    针对“Node.js 实现远程桌面监控的方法步骤”这个主题,我将根据以下步骤给出详细的攻略: 确定项目需求,选择合适的开发框架和技术栈。 搭建基础环境,如安装Node.js和npm。 实现远程桌面监控的功能,可以考虑使用第三方工具或者自行封装。 搭建前端页面,结合WebSocket技术实现实时监控。 部署,将应用程序上传至服务器,并配置好相关环境。 下面我将…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部