NodeJS服务器的部署

这个库是100%的纯JS。这对兼容性很好,但往往会锁定长期运行的进程。在网络浏览器中,Web Workers被用来从浏览器主线程中卸载工作。在NodeJS中,还有其他策略。这个演示展示了应用于不同服务器框架的几种不同策略。

注意:这些例子只是演示了核心概念,并不包括适当的错误检查或其他生产级功能。

Express Setup

测试Express演示需要以下命令:

npm install express printj express-formidable https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
node express.js

Koa Setup

为了测试Koa演示,需要以下命令:

npm install koa printj formidable https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
node koa.js

Hapi Setup

注意:所写的 Hapi 演示仅适用于 Hapi 16 及以下版本。

测试Hapi演示需要以下命令:

npm install hapi@16.x printj tiny-worker https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
node hapi.js

Node Buffer

readwrite 函数可以处理 type:"buffer"Buffer 数据。例如, request 库在缓冲区中返回数据:

var XLSX = require('xlsx'), request = require('request');
request(url, {encoding: null}, function(err, res, data) {
	if(err || res.statusCode !== 200) return;

	/* 数据是一个节点缓冲区,可以传递给 XLSX.read */
	var workbook = XLSX.read(data, {type:'buffer'});

	/* 在这里对工作簿做一些事情 */
});

readFile readFile writeFile 函数包装fs . fs.{read,write}FileSync

/* 等价于 `var wb = XLSX.readFile("sheetjs.xlsx");` */
var buf = fs.readFileSync("sheetjs.xlsx");
var wb = XLSX.read(buf, {type:'buffer'});

对表格上传的回应

使用 formidable ,上传到表单的文件存储到可以使用 readFile 读取的临时文件中:

/* 在服务器回调函数(request, response) { */
var form = new formidable.IncomingForm();
form.parse(req, function(err, fields, files) {
	var f = files[Object.keys(files)[0]];
	var workbook = XLSX.readFile(f.path);
	/* 在这里对工作簿做一些事情 */
});

node.js 演示展示了一个简单的HTTP 服务器,它接受文件上传并将数据转换为请求的输出格式。

Example servers

每个例子的服务器都要在内存中持有一个数组的数组。它们被期望能处理。

  • POST / 接受编码 file 并更新内部存储
  • GET /?t=<type> 返回指定类型的内部存储
  • POST /?f=<name> 读取本地文件并更新内部存储
  • GET /?f=<name> 将文件写入指定名称

用cURL进行测试是很直接的。

# 上传 sheetjs.csv 并更新数据
curl -X POST -F "data=@sheetjs.csv" http://localhost:7262/
# 下载 SYLK 格式的数据
curl -X GET http://localhost:7262/?t=slk
# 从服务器目录读取 sheetjs.csv
curl -X POST http://localhost:7262/?f=sheetjs.csv
# 以 XLSB 格式编写 sheetjs.xlsb
curl -X GET http://localhost:7262/?f=sheetjs.xlsb

主程序逻辑与表达

最直接的方法是直接在 HTTP 事件处理程序中处理数据。 XLSX.readXLSX.writebuffer 类型可直接与 http 模块和 express 一起使用。以下代码段基于数组数组生成工作簿并将其发送到客户端:

function send_aoa_to_client(req, res, data, bookType) {
	/* 生成工作簿 */
	var ws = XLSX.utils.aoa_to_sheet(data);
	var wb = XLSX.utils.book_new();
	XLSX.utils.book_append_sheet(wb, ws, "SheetJS");

	/* 生成缓冲区 */
	var buf = XLSX.write(wb, {type:'buffer', bookType:bookType || "xlsx"});

	/* 发送给客户端 */
	res.status(200).send(buf);
}

叉子与可可木

child_process.fork 提供了一种轻量级和可定制的方式来从主服务器进程中卸载工作。此演示将命令传递给自定义子进程,子进程将数据传递回缓冲区。

主服务器脚本是 koa.js ,工作脚本是 koasub.js 。状态在工作脚本中维护。

使用hapi的tiny-worker

tiny-worker 提供了一个类似 Web Worker 的界面。二进制字符串和简单对象很容易跨越 Worker 分界线。

主服务器脚本是 hapi.js ,工作脚本是 worker.js 。状态在服务器脚本中维护。

注意:由于hapi payload解析的问题,路由 POST /file 用于处理从文件读取的情况,所以cURL测试为:

# 上传 sheetjs.csv 并更新数据
curl -X POST -F "data=@sheetjs.csv" http://localhost:7262/
# 下载 SYLK 格式的数据
curl -X GET http://localhost:7262/?t=slk
# 从服务器目录读取 sheetjs.csv
curl -X POST http://localhost:7262/file?f=sheetjs.csv
# 以 XLSB 格式编写 sheetjs.xlsb
curl -X GET http://localhost:7262/?f=sheetjs.xlsb

NestJS

NestJS是用于服务器端 Web 应用程序的 Node.js 框架。

此演示使用 SheetJS 通过 POST API 端点解析电子表格。 form-data 到达端点,可使用 file 键访问。解析文件后,将返回第一个工作表的 CSV 内容。正文解析使用 multer

在运行演示之前,必须安装 NestJS CLI 工具。NestJS “第一步”中描述了该指令:

npm i -g @nestjs/cli
make nest

该演示可以使用 /sheetjs/upload-xlsx-file 端点进行测试:

curl -X POST -F "file=@test.xlsx" http://localhost:3000/sheetjs/upload-xlsx-file

包含的 nest.sh 脚本创建和配置项目。

这个演示创建了一个模块和一个控制器。控制器处理实际请求(创建端点),而模块用于配置 multer

Deno

Drash 是 Deno 的 HTTP 服务器的 Deno 框架。

drash.ts drash.ts 响应 POST 请求并响应 HTML 预览。

https://s2c.deno.dev是该服务的实时部署。

Analytics