手把手教你使用Express框架在Node服务端实现图片渲染

手把手教你使用Express框架在Node服务端实现图片渲染

  • 1.前言
  • 2.node-canvas库
  • 3.搭建node服务端环境
    • 3.1 初始化项目
    • 3.2 使用内置http模块创建服务
    • 3.3 使用Express创建服务
  • 4.服务端渲染图片
    • 4.1 创建Express路由
    • 4.2 绘制三角形
    • 4.3 静态资源中间件
    • 4.4 写入图片文件
    • 4.5 渲染Echarts图表

1.前言

大家知道前端如何绘制出下面这个三角形吗?

在这里插入图片描述

相信很多人的答案都是canvas,使用canvas确实很容易就能实现上面的效果,代码如下:

<canvas id="canvas" width="400" height="400"></canvas>
<script>var canvas = document.getElementById('canvas');// 获取canvas元素var ctx = canvas.getContext('2d');// 获取绘图上下文//绘制一个三角形ctx.moveTo(100, 100);ctx.lineTo(200, 200);ctx.lineTo(50, 100);ctx.lineTo(100, 100);ctx.stroke();
</script>

对canvas不了解的可以去看我的这篇文章,那你知道在Node.js服务端中如何使用canvas绘图吗,本文就来聊聊node服务端渲染图片。

2.node-canvas库

node中是没有DOM的,怎么绘图呢?这就得用到node-canvas这个库,来实现在node中进行canvas渲染。

不过,使用node-canvas这个库,不同的系统需要安装对应的依赖环境,如下图所示:
在这里插入图片描述
具体环境配置可以参考node-canvas官网

3.搭建node服务端环境

3.1 初始化项目

创建一个文件夹draw,执行npm init命令,该命令的作用就是初始化一个 package.json 文件,将项目变成一个npm项目:

npm init

接着可以一路回车下去,就会发现 package.json 文件已经创建好了。

  • 安装node-canvas

安装node-canvas库,执行如下命令:

npm install canvas
  • 安装nodemon

nodemon是一个流行的开发服务器,能够检测工作区代码的变化,并自动重启。执行下面命令进行安装 :

npm install nodemon --save-dev

这里将nodemon安装为开发依赖 devDependencies,因为仅仅只有在开发时才需要用到。同时可以配置start命令,package.json文件如下:

{"name": "draw","version": "1.0.0","description": "","main": "index.js","scripts": {"start": "nodemon server.js","test": "echo \"Error: no test specified\" && exit 1"},"author": "","license": "ISC","devDependencies": {"nodemon": "^3.0.1"},"dependencies": {"canvas": "^2.11.2"}
}

3.2 使用内置http模块创建服务

在文件夹下新建一个server.js文件,代码如下:

//server.js
//1.导入 http 模块
const http = require('http');const hostname = 'localhost';
const port = 3000;
//2.创建 HTTP 服务器
const server = http.createServer((req, res) => {res.end('Hello World');
});
//3.监听端口, 启动服务
server.listen(port, () => {console.log(`Server running at http://${hostname}:${port}/`);
});

运行npm start开启服务器:

npm start

浏览器打开http://localhost:3000/,可以看到如下效果:

在这里插入图片描述

直接用内置的 http 模块搭建服务器有个明显的缺点,就是没有专门的路由机制,即不能根据客户端不同URL及HTTP方法来返回相应内容。

因此,我们可以对上述代码进行改进,使用Express来开发Web服务器。

3.3 使用Express创建服务

Express是一个基于Node.js的快速、极简的流行Web开发框架,封装了很多功能,如路由和中间件等,可以更加方便的进行开发。

安装Express

npm install express

改写上述server.js代码,如下:

//server.js
//1.导入 express
const express = require('express');const hostname = 'localhost';
const port = 3000;
//2.创建应用对象
const app = express();
//3.创建路由规则
app.get('/', (req, res) => {res.send('Hello World');
});
//4.监听端口 启动服务
app.listen(port, () => {console.log(`Server running at http://${hostname}:${port}/`);
});

运行npm start开启服务器,同样可以看到如下效果:

在这里插入图片描述
到这里,环境就基本搭建好了,下面正式开始绘图。

4.服务端渲染图片

4.1 创建Express路由

Express路由的官方定义:确定应用程序如何响应客户端对特定端点的请求,端点是 URI(路径)和HTTP请求方法(GET、POST 等)。

通俗来讲就是服务器根据客户端访问的端点选择相应处理逻辑的机制。一个路由的组成有请求方法,路径和回调函数,如下所示:

app.METHOD(PATH, HANDLER)

因此,我们可以创建一个用于绘图的路由:

app.get('/drawTriangle', (req, res) => {//在这里写代码逻辑
});

4.2 绘制三角形

这里我们先来实现一下上面这个三角形的例子。

首先需要通过node-canvas提供的createCanvas方法创建画布,代码如下:

//引入createCanvas创建画布方法
const { createCanvas } = require("canvas");
//创建一个400 * 400的canvas
const canvas = createCanvas(400, 400);

其实node中绘图和前端绘图最主要的区别就在这里,node中需要通过node-canvas来创建canvas元素,接下来的绘图就和前端一致了:

...
//获取渲染上下文
const ctx = canvas.getContext("2d");
//绘制三角形
ctx.moveTo(100, 100);
ctx.lineTo(200, 200);
ctx.lineTo(50, 100);
ctx.lineTo(100, 100);
ctx.stroke();

完成绘图后,接下来就是把绘制结果返回给前端。

4.3 静态资源中间件

Express内置了处理静态资源的中间件函数express.static,可以提供图片、CSS 文件、JS 文件这类静态文件的服务。

  • 什么是中间件?

中间件本质就是一个回调函数,作用就是使用函数封装能够适用多个应用场景、可复用性良好的代码。

通过如下代码就可以设置一个静态文件中间件,指定当前文件夹下的public目录作为静态资源根目录:

app.use(express.static('./public'));

这样我们就可以访问public目录中的所有文件了,如:

http://localhost:3000/images/bg.png
http://localhost:3000/css/style.css
http://localhost:3000/js/app.js

4.4 写入图片文件

接下来我们只需要把绘制好的图片写入到public目录下即可,我们可以通过fs模块来实现。fs模块是Node.js中的内置模块,可以对计算机中的磁盘进行操作,如文件写入、读取、删除等。

文件写入可以使用fs.writeFileSync或fs.writeFile,两者区别:前者是同步写入,js主线程会等待其他线程的执行结果,然后再继续执行主线程的代码,效率较低;后者是异步写入,js主线程不会等待其他线程的执行结果,直接执行后续的主线程代码,效率较好。

这里我们使用fs.writeFile异步写入,其语法格式为:

fs.writeFile(file, data[, options], callback)

参数说明:

  • file 文件名
  • data 待写入的数据
  • options 选项设置(可选)
  • callback 写入回调

具体可以参考node官网。绘制的完整代码如下:

const express = require("express");
//引入创建画布方法
const { createCanvas } = require("canvas");
//引入fs模块
const fs = require('fs');const hostname = "localhost";
const port = 3000;const app = express();
//静态资源中间件的设置
app.use(express.static("./public"));//创建绘图路由
app.get("/drawTriangle", (req, res) => {//创建画布const canvas = createCanvas(400, 400);//获取渲染上下文const ctx = canvas.getContext("2d");//绘制三角形ctx.moveTo(100, 100);ctx.lineTo(200, 200);ctx.lineTo(50, 100);ctx.lineTo(100, 100);ctx.stroke();//定义写入的目录和文件名const imagePath = "./public/images";const imageName = "triangle.png";//如果不存在images图片目录就创建一个if (!fs.existsSync(imagePath)) {fs.mkdirSync(imagePath);}//将绘制结果写入指定文件,这里toBuffer创建一个Buffer表示画布中包含的图像对象,Buffer对象专门用来处理二进制数据fs.writeFile(`${imagePath}/${imageName}`, canvas.toBuffer(), function (err) {if (err) {console.log("写入失败");} else {console.log("写入成功");}});
});app.listen(port, () => {console.log(`Server running at http://${hostname}:${port}/`);
});

当请求http://localhost:3000/drawTriangle时,就会进行三角形的绘制,并写入public静态资源目录:

在这里插入图片描述

然后浏览器就可以访问这个图片,如下所示:
在这里插入图片描述
到这你以为结束了吗?绘图怎么能少得了Echarts呢,下面就来讲讲Echarts的渲染。

4.5 渲染Echarts图表

安装echarts库

npm install echarts

引入echarts库

const echarts = require("echarts");

渲染Echarts图表,代码如下:

//server.js
...
const options = {title: {text: "第一个 ECharts 实例",},tooltip: {},legend: {data: ["销量"],},xAxis: {data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],},yAxis: {},series: [{name: "销量",type: "bar",data: [5, 20, 36, 10, 10, 20],},],
};
app.get("/drawChart", (req, res) => {const canvas = createCanvas(400, 400);const imagePath = "./public/images";const imageName = "chart.png";//初始化echarts,使用创建的canvas作为初始化容器const chart = echarts.init(canvas);chart.setOption(options);//写入文件,chart.getDom()即获取绘制好的canvasfs.writeFile(`${imagePath}/${imageName}`, chart.getDom().toBuffer(), function (err) {if (err) {console.log("写入失败");} else {console.log("写入成功");}});
});
...

当请求http://localhost:3000/drawTriangle时,就会进行图表的渲染:

在这里插入图片描述
浏览器访问:

在这里插入图片描述
好了,以上就是本文的全部内容,如有问题,欢迎指出,如有帮助,点个赞,鼓励一下作者吧。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Data Assistant 快速创建测试数据集

使用 Data Assistant 快速创建测试数据集 Data Assistant 提供超过 100 种数据类型&#xff0c;为任何开发、测试或演示目的生成大量、异构、真实的数据。 官网地址&#xff1a; http://www.redisant.cn/da 主要功能 Windows 原生 Data Assistant 使用 Windows Native 技术…

SpringBoot集成Redisson操作Redis

目录 一、前言二、基础集成配置&#xff08;redis单节点&#xff09;2.1、POM2.2、添加配置文件2.3、添加启动类2.4、添加测试类测试redisson操作redis 一、前言 Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格&#xff0c;Redisson相比较与Jedis和Lettuce来说最…

表结构的操作【MySQL】

文章目录 创建表例子 查看表结构修改表新增列属性修改列属性修改列名修改表名删除列 删除表 阅读前导&#xff1a; 一般来说&#xff0c;对表的操作可以分为对表结构和对表内容的操作。 对表结构的操作&#xff0c;就是用数据定义语言 DDL 来创建、修改或删除表中的对象&#…

数字秒表设计仿真VHDL跑表,源码,视频

名称&#xff1a;简单秒表设计仿真VHDL跑表 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; 数字秒表功能描述 本次练习只需要一个数码管(假设该数码管已被选中),实现数码管显示功能,具体要求如下(设数码管为共阳&#xff09; 1)实现秒表计时功能。…

在Word中,图片显示不全

在今天交作业的时候&#xff0c;发现了一个非常SB的事情&#xff0c;把图片复制过去显示不完全&#xff1a; 使用文心一言查看搜索了一下&#xff0c;发现可能是以下几种原因&#xff1a; 图片所在行的行高设置不正确。可以重新设置行高&#xff0c;具体步骤包括打开图片显示…

C++迭代器失效

在STL中&#xff0c;有些操作会导致迭代器失效&#xff0c;即之前获取的迭代器无法再安全地使用。这是因为这些操作可能会改变容器的结构&#xff0c;例如插入、删除元素等。 具体来说&#xff0c;以下情况下迭代器会失效&#xff1a; 1. 当插入或删除元素导致容器中的内存重新…

[ Windows-Nginx ]Windows服务器,Tomcat容器部署项目,整合Nginx

一、官网下载Nginx http://nginx.org/en/download.html 稳定版&#xff1a;windows的stable版本 注意&#xff1a;Nginx安装包不要放在中文目录下 二、conf目录下&#xff0c;修改nginx.conf文件 修改Nginx服务端口&#xff1a; 默认端口为80&#xff0c;即外界访问的入口…

localforage-本地存储的优化方案

前言 前端本地化存储算是一个老生常谈的话题了&#xff0c;我们对于 cookies、Web Storage&#xff08;sessionStorage、localStorage&#xff09;的使用已经非常熟悉&#xff0c;在面试与实际操作之中也会经常遇到相关的问题&#xff0c;但这些本地化存储的方式还存在一些缺陷…

【Java 进阶篇】深入了解 Bootstrap 插件

Bootstrap 是一个流行的前端框架&#xff0c;提供了各种强大的插件&#xff0c;用于增强网页和应用程序的功能和交互性。本篇博客将深入介绍 Bootstrap 插件&#xff0c;适用于那些刚刚开始学习前端开发的小白。 什么是 Bootstrap&#xff1f; 在深入探讨 Bootstrap 插件之前…

【Java 进阶篇】深入浅出:Bootstrap 轮播图

在现代网页设计中&#xff0c;轮播图是一个常见的元素。它们可以用于展示图片、广告、新闻、产品或任何您希望吸引用户注意力的内容。要实现一个轮播图&#xff0c;您通常需要一些复杂的HTML、CSS和JavaScript代码&#xff0c;这对于初学者来说可能会感到困难。但幸运的是&…

Docker概述、部署、镜像与容器管理

Docker概述、部署、镜像与容器操作 一、Docker是什么&#xff1f;1.1、Docker介绍1.2、Docker的设计宗旨1.3、容器运行条件1.4、容器与虚拟机的区别1.5、Docker核心概念1.5.1、镜像1.5.2、容器1.5.3、仓库 二、Docker部署三、Docker 镜像管理3.1、搜索镜像3.2、查看仓库中有哪些…

2022年全国部分省市跨境电商交易规模汇总

近年来&#xff0c;跨境电商发展迅速&#xff0c;国家陆续出台了相关支持政策&#xff0c;跨境电商优势和潜力有望进一步释放。海关总署数据&#xff0c;根据初步测算&#xff0c;2022年我国跨境电商进出口2.11万亿元&#xff0c;增长9.8%。其中&#xff0c;出口1.55万亿元&…