Node学习(四)-Resful风格-BFF

成功解决:node作BFF,整合数据,转发请求 问题 项目设计为双后台。 一个是python后台,返回的通用数据,数据都比较原子化。 一个是node后台,作为BFF(Backends For Frontends 服务于前端的后端),为前端提供整合好的数据。 node作为中间服务器,需要多次请求python后台数据,并将其整合成前端需要的形式 本文的问题便是如何整合后台数据并返回 前置信息 python提供的接口: spu接口 const API = '/spu?spu=spuname' const response = { . 阅读详情

一、Resful风格

【相同的地址不同请求方式,相同请求方式不同地址】

1.1基于图书馆案例改造

RESful 风格 API
GET    http://localhost:8080/books            获取图书
POST   http://localhost:8080/books/book       添加图书
GET    http://localhost:8080/books/book/:id   根据id获取图书
PUT    http://localhost:8080/books/book       编辑图书
DELETE http://localhost:8080/books/book/:id   删除图书

(一)将原本ajax中的url和type全部替换
(二)id获取问题:

ctx.request.query.editid====换为==>ctx.params.id

二、 es module

2.1 上篇

(一)新建es.html
(二)新建路由

_.get('/es',contro.actionEs()) 

(三)在controller中编写路由对应方法

actionEs(){
    return async function (ctx) {
        await ctx.render('es',{});
    }
}

(四)编写es.js

class person {
    constructor(){}

    fn(){
        console.log('===>',"es module");
    }
}
export default person;

(五)在es.html中获取js中的方法

<h2>hello</h2>
<!-- <script src="/js/es.js"></script> -->
<script>
    import('/js/es.js').then(_=>{
        console.log('_default',_.default)

        let Person = _.default;
        let person = new Person;
        person.fn();
    })
</script>

2.1 下篇

(一)安装@babel/cli、@babel/core、@babel/plugin-transform-modules-systemjs
(二)“build”: “babel ./assets/js/es.js -o ./assets/js/es_bundle.js”
(三)创建.babelrc文件

{
    "plugins": ["@babel/plugin-transform-modules-systemjs"]
}

(四)es.html中

<h2>hello</h2>
    <script nomodule src="https://cdn.staticfile.org/systemjs/6.8.3/system.min.js"></script>
    <!-- <script src="/js/es.js"></script> -->
    <script type="module">
        console.log("====>",'支持 es module')
        import('/js/es.js').then(_=>{
            console.log('_default',_.default)

            let Person = _.default;
            let person = new Person;
            person.fn();
        })
    </script>
     <script nomodule>
        System.import('/js/es_bundle.js').then(_=>{
            console.log('_default====>','system module')

            let Person = _.default;
            let person = new Person;
            person.fn();
        })
    </script>

三、 服务器端发起请求

在这里插入图片描述

3.1请求别人的网站

const http = require('http');
const fs = require('fs');
const path = require('path');

let req = http.request('http:/www.taobao.com',res=>{
    let result = '';
    res.on('data',chunk=>{
        result += chunk;
    })
    res.on('end',() => {
        // console.log('=====>','数据接收完成');
        // console.log('result ====>',result);
        fs.writeFile(path.join(__dirname,'baidu.html'), result, err => {
            if(err) {
                console.log(' ====>','err');
                return;
            }
            console.log(' ====>','success')
        })
    })

});
req.end();

3.2 请求自己的

const http = require('http');

let req = http.request('http://localhost:8080/books',res=>{
    let result = '';
    res.on('data',chunk=>{
        result += chunk;
    })
    res.on('end',() => {
        console.log('result ====>',result);
    })
});
req.end();

(一)第一步 运行图书管理系统服务器
(二)第二步 在运行这个服务器

3.3 请求后–>加数据

const http = require('http');
const querystring = require('querystring');
let obj={
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
    }
}
//http://nodejs.cn/api/http.html#http_http_request_url_options_callback
let req = http.request('http://localhost:8080/books/book',obj, res=>{
    let result = '';
    res.on('data',chunk=>{
        result += chunk;
    })
    res.on('end',() => {
        console.log('result ====>',result);
    })
});
//querystring查询字符串 不光是模块 也是术语
const postData = querystring.stringify({
    'name': '你好世界',
    'author': '你好世界',
    'category': '你好世界',
    'description': '你好世界'
});
//打印瞅瞅是啥东东
console.log('postData===>',postData)
// 将数据写入请求主体。
req.write(postData);
req.end();

3.4 请求后–>修改数据

在这里插入图片描述

3.5 请求后–>删除数据

const http = require('http');
let obj={
    method: 'delete',
}
//http://nodejs.cn/api/http.html#http_http_request_url_options_callback
let req = http.request('http://localhost:8080/books/book/22',obj, res=>{
    let result = '';
    res.on('data',chunk=>{
        result += chunk;
    })
    res.on('end',() => {
        console.log('result ====>',result);
    })
});
req.end();

四、 BFF

4.1概念

Backend For Frontend (服务于前端的后端)

专门用于为前端业务提供数据的后端程序,这类程序的特点是不需要太强的服务器运算能力,但对程序的灵活性有较高的要求,这两个特点都正好和 nodejs 的优势相吻合,在 web 服务开发领域搭建一个 nodejs BFF 层是有很大的好处的。

对于 web 业务本身来说,nodejs 现在是最合适用来做 BFF 层的一门技术。有一个 nodejs BFF 层,能让前端有能力自由组装后台数据,这样可以减少大量的业务沟通成本,加快业务的迭代速度。同时前端工程师能自主决定前端与后台的通信方式,也让前端工程师有了更多的能力着手于 web 应用的性能优化。
在这里插入图片描述

4.2 本案例基于图书馆案例

首先在概念图的基础上进行
在这里插入图片描述

4.2.1左边的路由index.js
const router = require('koa-simple-router')
//返回页面的
const controllers = require('./indexController');
const contro = new controllers();
//返回接口
const APIContributors = require('./APIController')
const apicontro = new APIContributors();

let controller = (app) => {
    //返回页面
    app.use(router(_ => {
        //返回主页
        _.get('/',contro.index())
        _.get('/index',contro.index())
        _.get('/es',contro.actionEs())          
    }))
    //返回接口
    app.use(router({ prefix: '/api' }, _ => {
        //测试用
        // _.get('/test',ctx =>{
        //     ctx.body = "hahahah"
        // })
        //获取图书
        _.get('/books',apicontro.adminindex())
        //添加图书页
        // _.get('/books/book',contro.actionAddPage())
        _.post('/books/book',apicontro.actionAdd())    
    }))
}
module.exports = controller;
4.2.2controller下的APIController.js
let IndexBookModel = require('../models');
let indexBookModel = new IndexBookModel(); 

class APIContributors{
    constructor(){} 
    //获取图书
    adminindex(){
        return async function (ctx) {
            let msg = await indexBookModel.getData();
            //要前端渲染  将msg传给页面
            ctx.body = msg;
        }
    }
    //添加图书
    actionAdd(){
        return async function (ctx) {  
            // console.log(ctx.request.body)        
            try{
                let msg = await indexBookModel.addData(ctx.request.body);
                // console.log('msg',msg)
                if(msg.code == 0){
                    // console.log(1)
                    //返回数据
                    ctx.body = msg;
                }else{
                    ctx.body = '添加失败!'
                }               
            }catch(err){
                console.log('err',err)
            }            
        }
    }
}
module.exports = APIContributors;
4.2.3models下的index.js
const SafeRequest = require('../util/SafeRequest');
class IndexBookModel{
    constructor(){}
    //获取数据
    getData(){
        let safeRequest = new SafeRequest('/books');
        return safeRequest.fetch();
    }
    //处理图书
    addData(opt){
        let safeRequest = new SafeRequest('/books/book');
        
        return safeRequest.fetch({
            method: 'post',
            params: opt
        });
    }
}
module.exports = IndexBookModel;
4.2.4util下的SafeRequest
const config = require('../config')
const axios = require('axios');
class SafeRequest{
    constructor(url){
        this.baseUrl = config.baseURL,
        this.url = url;
    }
    fetch(options){
        // console.log(this.baseUrl + this.url)
        let bookFetch = axios.get(this.baseUrl + this.url);
        if(options){
            console.log(options.params)
            bookFetch = axios({
                url: this.baseUrl + this.url,
                method: options.method,
                data: options.params
            })
        }

        return new Promise((resolve, reject) =>{
            let result = {
                code:0,
                message:'',
                data:[]
            }
            bookFetch
                .then(msg =>{
                    // console.log('msg====>',msg);
                    if(msg.data.code && msg.data.code == 0){
                        result.data = msg.data.data;
                        result.message = msg.data.message;
                    }else{
                        result.data = msg.data;
                    }
                    result.data = msg.data;
                    resolve(result);
                })
                .catch(err =>{
                    result.code = 1;
                    result.message = '与后台通信失败';
                    reject(result);
                })
        })  
    }
}
module.exports = SafeRequest;
4.2.4config下的index.js
const _ = require('lodash')
const path = require('path')

let config = {
    "staticDir": path.join(__dirname, '..', 'assets'),
    "templateDir": path.join(__dirname, '..', 'views')
}
if(process.env.NODE_ENV == 'development'){
    let localPort = {
        port: 8080,
        baseURL:`http://localhost:8088`
    };
    _.assignIn(config, localPort)
}
if(process.env.NODE_ENV == 'production'){
    let prodPort = {
        port: 80
    };
    _.assignIn(config, prodPort)
}
module.exports = config;

使用Postman进行测试添加模块
在这里插入图片描述

axios的功能特点:
(一)在浏览器中发生XMLHttprequest请求;(二)在node.js中发生http请求;(三)基于promise API;(四)拦截请求和响应;(五)转换请求数据和响应数据;(六)自动转换JSON数据;(七)客户端支持防御XSRF;

Node学习(一)
Node学习(二)
Node学习(三)

Node做BFF中间层架构优化前端开发体验并提升系统整体性能。 在使用 Node.js 构建 BFF(Backend for Frontend)层架构时,核心思想是为前端应用(如 Web、移动端或桌面应用)提供定制化的 API 接口,将后端复杂的服务逻辑抽象化、聚合化,从而优化前端开发体验并提升系统整体性能。 阅读详情

相关推荐

YOLO与3D点云融合:从原理到实践的多模态3D目标检测指南

最近在实验室和几个研究生聊天,发现一个挺有意思的现象:大家一提到“YOLO+3D点云”这个组合,第一反应往往是“顶会热门”、“发论文利器”,但真上手去复现或者想基于这个方向做点创新时,又常常卡在第一步——感觉每个部分都懂一点,但就是串不起来,不知道从哪开始,也不知道核心的“价值点”到底在哪。 这让我想起几年前刚开始接触这个领域时的自己,也经历过同样的困惑。当时看了很多论文,感觉“3D目标检测”这个方向既酷又难,YOLO负责2D图像里的快速定位,点云提供精确的三维空间信息,听起来是天作之合。但真正把代码跑起来

weixin_34267123的博客 413

【NodeJs】NodeJs专题之理解企业BFF框架原理

BFF框架指的是一种逻辑分成,而非一种新技术即 Backend For Frontend(服务于前端的后端),也就是服务器设计 API 时会考虑前端的使用,并在服务端直接进行业务逻辑的处理,又称为用户体验适配器。

量化Mike 1296

单片机欠压保护、欠压复位的用法及作用

一. 前言 使用编程环境 :KEIL mdk4 单片机 : NRF24LE1   二. 分析 查询各开发芯片的数据手册,一般在电源管理或者复位设置章节中。以下NRF24LE1为例: Power supply supervisor(电源监控): 电源主管在开机时对系统进行初始化,对即将发生的情况提供预警当电源电压过低而不能安全运行时,系统处于复位状态。 电源管理框图如下:   ...

城南花已开的博客 8401

大厂为啥都要用Node去写中间层(BFF)呢?

BFF是一种Web架构,全名为Backends For Frontends,即为服务于前端的后端。这个词来源于Sam Newman的一篇文章:Pattern: Backends For Frontends[1]。BFF一般指的是在前端与后端之间加增加一个中间层。为什么要在前端和后端之间增加一个BFF层呢?计算机科学中的所有问题都可以通过加一层来解决。因此,需要使用BFF的场景,肯定是普通的前后端开发模式遇到了部分问题。例如在Sam Newman的文章中就描述了BFF解决多个展示端的场景。

m0_46163918的博客 1191

手机也能跑!5.6MB的AnimeGANv3模型部署实战:从PyTorch到ONNX再到移动端推理

本文详细介绍了如何将轻量级动画生成器AnimeGANv3从PyTorch模型转换为ONNX格式,并部署到移动端进行实时推理。通过5.6MB的极简模型设计和优化策略,实现在手机等边缘设备上的高效动漫风格转换,涵盖模型准备、格式转换、移动端优化及性能调优全流程。

weixin_33724059的博客 383

5分钟搞定!用ZLMediaKit搭建GB28181视频监控系统(含避坑指南)

本文提供了一份基于ZLMediaKit搭建GB28181视频监控系统的实战指南。文章详细介绍了从环境准备、核心组件(ZLMediaKit与SIP服务器)部署、摄像头配置到内外网穿透的完整流程,并重点分享了设备ID配置、防火墙设置等关键避坑经验,帮助开发者快速构建稳定可控的监控平台。

apple5的专栏 1082

node上转接RESTful风格接口

按照最初的设计,node服务器是夹杂在前端页面与java服务器的中间服务器。所以前端页面请求node后,node还需要再去和服务器请求数据,然后再返回。这里java接口使用了RESTful 风格。node上使用request实现数据的请求。 RESTful 简介 一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主...

weixin_33840661的博客 163

GJB 5000B二级-II实施基础

本文主要描述GJB 5000B二级II实施基础与GJB 5000A的变化情况,以及过程域各条款的实施要点

Abel的博客 2579

HOW - BFF 服务实践系列(一)- 基于 NodeJS 实现

基于 Node.js 实现一个 BFF 服务,以下是一个详细的指南,帮助前端开发者使用 Node.js 创建一个功能完备的 BFF 服务。

weixin_58540586的博客 1883

Vue3 - 详解实现网站接入钉钉扫码登录功能,钉钉授权生成登录二维码用户用手机扫描二维码登陆,支持弹框式、浏览器单独新开页显示,钉钉扫描二维码登录详细流程及示例代码,最新vue集成钉钉扫码授权登录!

vue3,nuxt3,钉钉,扫码登录,vue3钉钉扫码登陆,钉钉授权第三方WEB网站扫码登录功能,钉钉扫码登录第三方网站,单点登录,二维码不显示,报错,扫了没反应,出错,vue3钉钉扫码登录,内嵌,获取个人信息,pc网页钉钉登录,钉钉扫码登录怎么新开一页,跳页显示二维码,内嵌登录二维码,iframe新页面弹出,弹出一个小窗口显示登录二维码,登录报错,扫码没反应,解决手机点登录报错没反应,官方文档,手机扫描钉钉二维码登录网站,页面弹出一个小窗口而不是打开一个页面,vue3中使用iframe实现另开小窗口扫码登

🏆 前端领域优质创作者 3694

OSPF规划两大模型:双塔奇兵、犬牙交错

大家好,今天给大家带来的是OSPF规划两大模型:双塔奇兵、犬牙交错,让我们直接开始吧! OSPF规划之双塔奇兵 说明: OSPF 如果某个区域存在两个 ABR,并且在两个 ABR 上都对 area n 内的路由做了聚合操作。 最佳配置: 两台ABR之间的红线应该使用以太网的子接口技术,一个子接口属于area0,另一个属于 area n;或者该链路规划为 area n,同时配置虚连接; ABR 的 loopback0 规划入 area 0 OSPF 规划之犬牙交错 说明: 有时接入层的设备会以乱序的

网络技术联盟站 2423

【Nodejs】Node.js简介

Node 的重要性已经不言而喻,很多互联网公司都已经有大量的高性能系统运行在 Node 之上。Node 凭借其单线程、异步等举措实现了极高的性能基准。此外,目前最为流行的 Web 开发模式是前后端分离的形式,即前端开发者与后端开发者在自己喜欢的 IDE 上独立进行开发,然后通过 HTTP 或是 RPC 等方式实现数据与流程的交互。

DomCode 5360

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Nodejs BFF 开发 8 个月的心路历程

来自 “Nodejs技术栈” 交流群 coolliyong 的 Nodejs BFF 层 8 个月开发过程中心得分享!正文从下面开始~忙碌的日子总是过得...

LuckyWinty的博客 1669

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Restful 风格接口【了解】

等方式对请求的处理方法进行区分,这样可以在前后台分离式的开发中使得前端开发人员不会对请求的资源地址产生混淆和大量的检查方法名的麻烦, 形成一个统一的接口。基于这个风格设计的软件可以更简结,更有层次,更易于实现缓存等机制。在 Vue 和 React 等大型项目中,我们常用的数据请方式,就是 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。引入的一个 axios, 创建一个单例,做了二层拦截,一层请求拦截(做配置),一层响应拦截(返回数据)。

qq_41988669的博客 833

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

config.js相关配置汇总

小菜鸟在总结

MoXinXueWEB的博客 3534

三种方法实现调用Restful接口

1.基本介绍   Restful接口的调用,前端一般使用ajax调用,后端可以使用的方法比较多,   本次介绍三种:     1.HttpURLConnection实现     2.HttpClient实现     3.Spring的RestTemplate 2.HttpURLConnection实现 1 @Controller 2 public class Rest...

weixin_30522095的博客 4780

Node入门笔记

node入门笔记

.bin的博客 1501

探索Node.js后端框架:`node-bff`

探索Node.js后端框架:node-bff 在这个快速发展的Web开发世界中,寻找一个高效、灵活且易于上手的后端框架是每个开发者的需求。今天,我们要向大家推荐的是一款名为的项目,它是一个基于Node.js构建的轻量级后端业务处理框架,旨在帮助开发者快速构建API服务。 项目简介 由作者eshengsky创建,它的核心理念在于提供一种简洁的方式,将前端和后端之间的接口定义与实现分离,让后端专注于数...

gitblog_00050的博客 584

前端-Node.js

Node.js1、Node.js的概念1.1 什么是Node.js1.2 JavaScript引擎1.3、Node.js有什么用2、BFF2.1、 BFF 解决什么问题2.2什么是BFF3、node.js3.1、下载3.2、安装3.3、 查看版本4、node.js快速入门4.1、控制台运行运行方式一运行方式二4.2 服务器端应用开发(了解) 1、Node.js的概念 1.1 什么是Node.js 通俗的说,Node.js就是javaScript运行环境。类似于Java的JVM。Node.js可以实现数据的封

qq_46112274的博客 1360

BFF——服务于前端的后端

Web 1.0第一代Web架构很简单,纯后端网页渲染;就是客户端每次向服务器请求都会返回一个特定的html页面,js都没啥大用场。我学生时代流行的JSP就属于这个范畴。后来上班了,发现厂里的操作更风骚,用的是的动态渲染技术,当时极为震惊。

2301_82243603的博客 444

大前端与BFF层——NodeJS在项目中的位置

“大前端”是最近起来的概念。和传统的前端相比,“大前端”有两个方面的扩展。一个是端的多样性,比如新增了iOS,Android,小程序,公众号等等。另外一个是往后端扩展,比如Node.js的兴起,或许写后端服务没有Java成熟,写BFF还是可以胜任的。 之前一直疑惑为何前端招聘中普遍要求有nodejs基础和后端开发经历,没有想出用nodejs写的后台在公司中担任什么角色。 今天有幸读到玉伯的...

yellowpig1210的专栏 1万+

一种不错的 BFF Microservice GraphQL/REST API 层的开发方式

云原生(Cloud Native)Node JS Express Reactive 微服务模板 (REST/GraphQL) 这个项目提供了完整的基于 Node JS / Typescript 的微服务模板,包括生产部署、监控、调试、日志记录、安全、CI/CD 所需的所有功能。还添加了基于响应性扩展的示例,以演示如何将其用于构建微服务 API 边缘服务(edge-service)、前端的后端(...

o__cc的博客 637
上一篇: springboot学习笔记(一)
下一篇: Vue2渐进式框架(一)
智汇风渔AI小白
博客等级 码龄7年 1万+粉丝 179原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智汇风渔AI小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值