express的使用(四) nodejs转发表单到后台

原文链接

搬砖的林小白-express的使用(四)
个人博客地址,求关注,也希望大家在里面批评我的不足之处

看前提示

本篇所讲述的内容是node端转发前端发送过来的表单到第三方中,应用的场景有很多,如我们经常做的将文件存储到七牛云或者amazon等服务上。我们常规的流程是:在nodejs 端中获取到前端传过来的表单文件,并将其存放到内存中,接着发送到第三方服务,下面的博客也是按照这样的流程来写。

本次工作的重点放在了node端转发表单文件到另一方去,因此,对于一开始的前端发送表单文件以及最后的第三方接受表单文件就不详细叙述,只是简单的贴上代码

依赖版本

"axios": "^1.4.0",
"express": "^4.18.2",
"multer": "^1.4.5-lts.1"

前端表单提交

前端的代码依旧按照上一篇博客的操作,直接使用postman提交一个表单数据,如下所示,依旧是一个form-data的格式,且字段为file,文件为一个jpg文件

curl --location --request POST 'http://localhost:3000/user/fileUpload' --form 'file=@"/C:/Users/34714/Documents/DSC05948.JPG"'

模拟第三方接接收文件

在后端的代码中,用multer以及express构建一个接收multipart/form-data请求的简单接口,代码如下

const express = require("express");
const app = express();
const multer = require("multer");
const upload = multer({
    storage: multer.diskStorage({
        // 将文件存储在uploads下面
        destination: function (req, file, cb) {
            cb(null, "uploads");
        },
        // 保存文件的原始名字
        filename: function (req, file, cb) {
            cb(null, file.originalname);
        },
    }),
});
// 文件上传api
app.post("/mockFileUpload", upload.single("file"), (req, res, next) => {
    console.log("模拟的后台端获取到的信息是===================>");
    console.log(req.file);
    if (req.file) {
        console.log(`文件的名字是${req.file.originalname}`);
    } else {
        console.log(`没有收到文件`);
    }
});

app.listen(3001, () => {
    console.log("服务3001已启动");
});


    {
      "name": "demo2",
      "version": "1.0.0",
      "main": "server.js",
      "dependencies": {
        "express": "^4.18.2",
        "multer": "^1.4.5-lts.1",
        "nodemon": "^2.0.22"
      },
      "scripts": {
        "test": "echo Error: no test specified && exit 1",
        "dev": "nodemon server.js"
      },
      "author": "",
      "license": "ISC",
      "description": ""
    }

nodejs 端代码

在上一篇的文件接收的基础上,我们需要做一些细微的改动,比如

1.文件只保存在内存中,并不保存于磁盘中,理由很简单,如果没有删除文件,会防止内存爆炸,又或者用户并发量很大,磁盘的读取很频繁,这会让我们收到很多的警报,搞不好可能要导致宕机,然后频繁的跟领导聊人生,又或者因为设置的文件夹没有读写权限而产生bug等。所以直接限制文件的大小,以及将文件存储在内存中,而不将其存储于内存中,在生产环境中是一个最适合的选择。

const upload = multer({});

2.当我们在后端构建一个表单提交的请求时,有前端开发经验的朋友可以很容易的知道,我们需要构建一个formData来存储我们的数据,而node端是没有formData这个方法的,所以我们需要借助form-data这个库来构建一个表单提交

    const formData = require("form-data");

此时,先让我们观察下接收到的file有哪些字段

看结构,我们可以看到文件的’内容’放在了buffer中,也想到了文档中有下面这些一句代码

那么,我们姑且将得到的buffer使用append进去

router.post("/fileUpload", upload.single("file"), (req, res, next) => {
    console.log("文件的信息是===================>");
    console.log(req.file);
    const form = new FormData();
    form.append("file", req.file.buffer);
});

接着,再用上我们很是习惯的axios,将请求发送出去。

// 文件上传api
router.post("/fileUpload", upload.single("file"), async (req, res, next) => {
    console.log("文件的信息是===================>");
    console.log(req.file);
    const form = new FormData();
    form.append("file", req.file.buffer);
    await axios({
        url: "http://localhost:3001/mockFileUpload",
        method: "post",
        data: form,
        headers: {
            "Content-Type": "multipart/form-data",
        },
    });
});

运行项目,让我们在另一个程序中,查看下返回的结果

因此,可以理解用这种方式传输的时候,经过踩坑(查看了下buffer以及stream等的一些属性)之后,发现了form-data的append这个方法可以传三个参数。

如果如此,第二个参数可以使用我们获得到的buffer,而第三个参数,按照文档的提示,只能且行且试了,将我们multer获取到的文件的参数一一放进去

form.append('file', stdout, {
    filename: 'unicycle.jpg', // ... or:
    filepath: 'photos/toys/unicycle.jpg',
    contentType: 'image/jpeg',
    knownLength: 19806
});

最后组合的代码如下

router.post("/fileUpload", upload.single("file"), async (req, res, next) => {
 console.log("文件的信息是===================>");
 console.log(req.file);
 const form = new FormData();
 form.append("file", req.file.buffer, {
     filename: req.file.originalname,
     contentType: req.file.mimetype,
     knownLength: req.file.knownLength,
 });
 await axios({
     url: "http://localhost:3001/mockFileUpload",
     method: "post",
     data: form,
     headers: {
         "Content-Type": "multipart/form-data",
     },
 });
});

运行过后,在模拟后台中看到了下面的两个面板

由此可见,node端也是可以转发一个form-data出去的,如果跟后台沟通出了问题,建议直接丢这个模板给他。

最后再贴上一遍完整的代码

const express = require("express");
const router = express.Router();
const multer = require("multer");
const upload = multer({});
const FormData = require("form-data");
const { default: axios } = require("axios");

// 文件上传api
router.post("/fileUpload", upload.single("file"), async (req, res, next) => {
    console.log("文件的信息是===================>");
    console.log(req.file);
    const form = new FormData();
    form.append("file", req.file.buffer, {
        filename: req.file.originalname,
        contentType: req.file.mimetype,
        knownLength: req.file.knownLength,
    });
    await axios({
        url: "http://localhost:3001/mockFileUpload",
        method: "post",
        data: form,
        headers: {
            "Content-Type": "multipart/form-data",
        },
    });
});

module.exports = {
    userRouter: router,
};

参考链接

multer/README-zh-cn.md at master · expressjs/multer · GitHub

form-data - npm (npmjs.com)

注意事项

暂无​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/30528.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Scala学习笔记

累了,基础配置不想写了,直接抄了→Scala的环境搭建 这里需要注意的是,创建新项目时,不要用默认的Class类,用Object,原因看→scala中的object为什么可以直接运行 一、Scala简介 1.1 图解Scala和Java的关系 1…

大数据测试基本知识

常用大数据框架结构 1.大数据测试常用到的软件工具 工具推荐,对于测试数据构造工具有:Datafaker、DbSchema、Online test data generator等;ETL测试工具有:RightData、QuerySurge等;数据质量检查工具:great…

MySQL-SQL存储过程/触发器详解(上)

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏&#xf…

Three.js--》实现3d地月模型展示

目录 项目搭建 初始化three.js基础代码 创建月球模型 添加地球模型 添加模型标签 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本案例还…

《离散数学》:代数系统和图论导论

一、代数系统 代数系统是数学中的一个重要概念,它涉及一组对象以及定义在这些对象上的运算规则。代数系统可以是抽象的,也可以是具体的。 在抽象代数中,代数系统通常由一组元素和一组操作(或称为运算)组成。这些操作…

【MySQL新手入门系列四】:手把手教你MySQL数据查询由入门到学徒

SQL语言是与数据库交互的机制,是关系型数据库的标准语言。SQL语言可以用于创建、修改和查询关系数据库。SQL的SELECT语句是最重要的命令之一,用于从指定表中查询数据。在此博客中,我们将进一步了解SELECT语句以及WHERE子句以及它们的重要性。…

vue进阶-vue-route

Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得轻而易举。 本章只做学习记录,详尽的内容一定要去官网查看api文档 Vue Router-Vue.js 的官方路由 1. 路由的基本使用 1.1 安装vue-router npm install vue-…

SpringCloud Eureka注册中心高可用集群配置(八)

当注册中心扛不住高并发的时候&#xff0c;这时候 要用集群来扛&#xff1b; 我们再新建两个module microservice-eureka-server-2002 microservice-eureka-server-2003 第一步&#xff1a; pom.xml 把依赖加下&#xff1a; <dependencies> <dependency…

golang 协程的实现原理

核心概念 要理解协程的实现, 首先需要了解go中的三个非常重要的概念, 它们分别是G, M和P, 没有看过golang源代码的可能会对它们感到陌生, 这三项是协程最主要的组成部分, 它们在golang的源代码中无处不在. G (goroutine) G是goroutine的头文字, goroutine可以解释为受管理的…

Prompt 范式产业实践分享!基于飞桨 UIE-X 和 Intel OpenVINO 实现跨模态文档信息抽取

近期 Prompt 范式备受关注&#xff0c;实际上&#xff0c;其思想在产业界已经有了一些成功的应用案例。中科院软件所和百度共同提出了大一统诸多任务的通用信息抽取技术 UIE&#xff08;Universal Information Extraction&#xff09;。截至目前&#xff0c;UIE 系列模型已发布…

Selenium 相对定位

目录 前言&#xff1a; 相对定位 工作原理 可用的相对定位 Above Below Left of Right of Near 链式相对定位 相对于WebElement的相对定位 实例演示 前言&#xff1a; Selenium传统定位基本能解决80%的定位需求&#xff0c;但是还是有一些复杂场景传统定位定不到的…

express框架学习笔记

express简介 express是一个基于Node.js平台的极简的、灵活的WEB应用开发框架。express是一个封装好的工具包&#xff0c;封装了很多功能&#xff0c;便于我们开发WEB应用&#xff08;HTTP服务&#xff09; express使用 新建express文件夹新建文件test01.js&#xff0c;代码如…

深蓝学院C++基础与深度解析笔记 第 5 章 语句

1. 语句基础 ● 语句的常见类别 – 表达式语句&#xff1a;表达式后加分号&#xff0c;对表达式求值后丢弃&#xff0c;可能产生副作用 – 空语句&#xff1a;仅包含一个分号的语句&#xff0c;可能与循环一起工作 – 复合语句&#xff08;语句体&#xff09;&#xff1a;由大…

电商数仓(用户行为采集平台)数据仓库概念、用户行为日志、业务数据、模拟数据、用户行为数据采集模块、日志采集Flume

1、数据仓库概念 数据仓库&#xff08; Data Warehouse &#xff09;&#xff0c;是为企业制定决策&#xff0c;提供数据支持的。可以帮助企业&#xff0c;改进业务流程、提高产品质量等。 数据仓库的输入数据通常包括&#xff1a;业务数据、用户行为数据和爬虫数据等。 业务数…

流场粒子追踪精度数值实验

在计算流线&#xff0c;拉格朗日拟序结构等流场后处理时&#xff0c;我们常常需要计算无质量的粒子在流场中迁移时的轨迹&#xff0c;无质量意味着粒子的速度为流场当地的速度。此时&#xff0c;求解粒子的位移这个问题是一个非常简单的常微分方程问题。 假设流场中存在 i 个粒…

Java版本+企业电子招投标系统源代码之电子招投标系统建设的重点和未来趋势

计算机与网络技术的不断发展&#xff0c;推动了社会各行业信息化的步伐。时至今日&#xff0c;电子政务、电子商务已经非常普及&#xff0c;云计算、大数据、工业4.0、“互联网”等发展理念也逐步深入人心&#xff0c;如何将传统行业与互联网科技有效结合起来&#xff0c;产生1…

Vue实现元素沿着坐标数组移动,超出窗口视图时页面跟随元素滚动

一、实现元素沿着坐标数组移动 现在想要实现船沿着下图中的每个河岸移动。 实现思路&#xff1a; 1、将所有河岸的位置以 [{x: 1, y: 2}, {x: 4, y: 4}, …] 的形式保存在数组中。 data() {return {coordinateArr: [{ x: 54, y: 16 }, { x: 15, y: 31 }, { x: 51, y: 69 }…

升级Nginx

目录 前言 一、升级Nginx 1&#xff09;首先在官网下载一个新版本的Nginx 2&#xff09;首先将下载的压缩包进行解包 3&#xff09;进入已解包的目录中 4&#xff09;配置安装路径 5&#xff09;make 6&#xff09;备份原来Nginx的资源 7&#xff09;重启Nginx服务 8&#…

【2023最全教程】Web自动化测试怎么做?Web自动化测试的详细流程和步骤

一、什么是web自动化测试 自动化&#xff08;Automation&#xff09;是指机器设备、系统或过程&#xff08;生产、管理过程&#xff09;在没有人或较少人的直接参与下&#xff0c;按照人的要求&#xff0c;经过自动检测、信息处理、分析判断、操纵控制&#xff0c;实现预期的目…

毕业季Android开发面试,有哪些常见的题?

前言 对于计算机行业早已烂大街&#xff0c;随之而来的毕业季。还会有大批的程序员涌进来&#xff0c;而我们想要继续进入Android开发岗位的人员&#xff0c;最先考虑的是面试。面试题是我们决定踏进工作的重要环节。 对于刚毕业的实习生来说&#xff0c;如何在应聘中脱颖而出…