在NAS上部署Barcode服务_nas可以部署web项目吗
部署基于BWIP-JS的条形码生成API
BWIP-JS 是一个优秀的JavaScript条形码生成库,它支持多种条形码类型,并且可以运行在Node.js环境下,非常适合用来构建API服务。
以下是部署步骤:
- 安装Node.js和npm
Armbian系统通常基于Debian,可以使用apt包管理器安装Node.js。建议安装较新版本的Node.js(如v18或更高版本)。
# 更新软件包列表
sudo apt update
sudo apt upgrade -y
# 安装Node.js和npm
# 注意:默认仓库的Node.js版本可能较旧,建议使用NodeSource提供的版本
# 首先安装NodeSource的脚本(以Node.js 18.x为例)
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
# 验证安装
node --version
npm --version
- 创建项目目录并初始化
# 创建一个目录来存放你的API服务
mkdir ~/barcode-api
cd ~/barcode-api
# 初始化npm项目(会生成package.json文件)
npm init -y
- 安装必要的依赖
我们需要安装 bwip-js(条形码生成库)和 express(Web框架)。
npm install bwip-js express
- 创建API服务器主文件(app.js)
使用 nano 或 vim 创建一个名为 app.js 的文件。
nano app.js
- 将以下代码复制到 app.js 文件中:
const express = require('express');
const bwipjs = require('bwip-js');
const app = express();
const port = 3000; // 你可以指定其他端口,比如80(需要sudo权限)
// 定义一个简单的GET路由来处理条形码生成请求
// 示例URL: http://your-armbian-ip:3000/barcode?bcid=code128&text=HelloArmbian&scale=3
app.get('/barcode', (req, res) => {
const { bcid, text, scale, includetext, textxalign } = req.query;
// 参数验证(必选参数)
if (!bcid || !text) {
return res.status(400).send('Missing required parameters: "bcid" and "text"');
}
// 设置BWIP-JS的选项,将查询参数映射过去
const options = {
bcid: bcid, // 条形码类型 (e.g., 'code128', 'qrcode')
text: text, // 要编码的文本
scale: scale ? parseInt(scale) : 3, // 缩放比例,默认3
includetext: includetext ? includetext.toLowerCase() === 'true' : true, // 是否在条码下方显示文本,默认true
textxalign: textxalign || 'center', // 文本对齐方式 'center', 'left', 'right'
// 更多参数请参考BWIP-JS文档: https://github.com/metafloor/bwip-js
};
// 尝试生成条形码
try {
bwipjs.toBuffer(options, (err, png) => {
if (err) {
console.error('Barcode generation failed:', err);
res.status(500).send('Error generating barcode: ' + err.message);
} else {
// 设置正确的Content-Type头部
res.set('Content-Type', 'image/png');
// 可以设置缓存控制头部(可选)
// res.set('Cache-Control', 'public, max-age=86400'); // 缓存一天
res.send(png);
}
});
} catch (error) {
console.error('Unexpected error:', error);
res.status(500).send('Unexpected error occurred');
}
});
// 启动服务器
app.listen(port, '0.0.0.0', () => { // 监听所有网络接口,方便其他设备访问
console.log(`Barcode API server running on http://0.0.0.0:${port}`);
});
- 保存并退出编辑器(在nano中按 Ctrl+X, 然后按 Y, 然后按 Enter)。
- (可选)使用进程管理器保持服务运行
为了避免SSH会话关闭后API服务停止,我们可以使用 pm2 这样的进程管理器。
# 全局安装
pm2 sudo npm install -g pm2
# 使用pm2启动你的API应用
pm2 start app.js --name "barcode-api"
# 设置pm2开机自启(需要先运行上一命令)
pm2 startup
# 执行pm2提示的命令来启用开机启动
pm2 save
- 允许防火墙端口(如果启用了防火墙)
如果你的Armbian设备启用了防火墙(如UFW),需要放行API使用的端口(例如3000)。
sudo ufw allow 3000/tcp # 如果你使用的是80端口,则: # sudo ufw allow 80/tcp
- 测试API
现在,API服务应该已经运行起来了。可以在同一局域网内的另一台电脑的浏览器中测试它(将 [YOUR-ARMBIAN-IP] 替换为你的Armbian设备的IP地址):
http://[YOUR-ARMBIAN-IP]:3000/barcode?bcid=code128&text=HelloArmbian&scale=3
如果一切正常,就应该能看到一个生成的Code128条形码图片。
VBA调用代码示例
在Excel VBA编辑器中,插入一个模块并粘贴以下代码。这段代码会调用你刚刚部署在Armbian上的API,并将生成的条形码图片插入到Excel中。
vba
Sub GenerateBarcodeFromArmbian()
' 定义变量
Dim WinHttpReq As Object
Dim ApiUrl As String
Dim BarcodeData As String
Dim BarcodeType As String
Dim ScaleFactor As String
Dim ResponseBody() As Byte
Dim TempFilePath As String
Dim TargetCell As Range
Dim ImageWidth As Long
Dim ImageHeight As Long
' ****************** 配置区域 ******************
' 设置你的Armbian设备的IP地址和端口
ApiUrl = "http://192.168.1.100:3000/barcode" ' 替换为你的Armbian设备IP和端口
BarcodeData = ThisWorkbook.Worksheets("Sheet1").Range("A2").Value ' 从A2单元格读取数据
BarcodeType = "code128" ' 条形码类型,如 code128, code39, qrcode 等 (必须与BWIP-JS支持的bcid一致)
ScaleFactor = "3" ' 缩放比例
' 将图片插入到哪个单元格
Set TargetCell = ThisWorkbook.Worksheets("Sheet1").Range("B2")
' 设置图片显示大小 (单位: 磅)
ImageWidth = 150
ImageHeight = 50
' **********************************************
If BarcodeData = "" Then
MsgBox "请在A2单元格输入要生成条形码的内容。"
Exit Sub
End If
' 构建完整的API请求URL (使用EncodeURL编码参数)
ApiUrl = ApiUrl & "?bcid=" & BarcodeType & "&text=" & WorksheetFunction.EncodeURL(BarcodeData) & "&scale=" & ScaleFactor
' 可以添加更多参数,例如 &includetext=false &textxalign=center
On Error GoTo ErrorHandler
Application.ScreenUpdating = False
' 创建HTTP请求对象 (需要启用 Microsoft WinHTTP Services 引用)
Set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
WinHttpReq.Open "GET", ApiUrl, False
WinHttpReq.Send
' 检查HTTP状态码
If WinHttpReq.Status = 200 Then
' 获取响应体(二进制数据)
ResponseBody = WinHttpReq.ResponseBody
' 创建临时文件
TempFilePath = Environ$("TEMP") & "\temp_barcode.png"
' 写入二进制数据到临时文件
Open TempFilePath For Binary Access Write As #1
Put #1, , ResponseBody
Close #1
' 删除可能已存在的旧图片(避免重叠)
On Error Resume Next
TargetCell.Parent.Pictures.Insert(TempFilePath).Delete
On Error GoTo 0
' 插入新图片并定位到目标单元格
With TargetCell.Parent.Pictures.Insert(TempFilePath)
.Top = TargetCell.Top
.Left = TargetCell.Left
.Width = ImageWidth
.Height = ImageHeight
.Placement = xlMoveAndSize ' 图片随单元格移动和调整大小
End With
' (可选)删除临时文件
Kill TempFilePath
MsgBox "条形码生成成功!"
Else
MsgBox "API请求失败! 状态码: " & WinHttpReq.Status & " : " & WinHttpReq.StatusText & vbCrLf & "请检查URL和网络连接。"
End If
CleanUp:
Application.ScreenUpdating = True
Set WinHttpReq = Nothing
Set TargetCell = Nothing
Exit Sub
ErrorHandler:
MsgBox "发生错误 #" & Err.Number & ": " & Err.Description, vbCritical
Resume CleanUp
End Sub
使用说明和注意事项:
- 启用VBA引用:在VBA编辑器中,点击 工具 -> 引用,确保勾选了 Microsoft WinHTTP Services, version 5.1。如果没有,请浏览并添加 winhttp.dll。
- 修改配置:务必修改代码中 ApiUrl 的IP地址和端口,使其指向你的Armbian设备。
- 参数调整:可以根据需要修改 BarcodeType(支持的bcid如code128, code39, ean13, qrcode等,请参考BWIP-JS文档)、ScaleFactor(数字越大图片越大越清晰)以及在URL中添加其他BWIP-JS支持的参数(如height, includetext, textxalign等)。
- 错误处理:代码中包含基本的错误处理。如果API调用失败,请检查Armbian设备的防火墙设置、Node.js服务是否正常运行,以及URL是否正确。
- 性能:由于是通过网络请求获取图片,速度会比本地生成稍慢,但在局域网内通常很快。
其他考虑和增强建议
- 使用Nginx反向代理:可以安装和配置Nginx作为反向代理,将API服务映射到80端口,甚至可以使用域名和HTTPS,使URL更简洁安全。
- 更多API功能:可以扩展 app.js,添加更多路由、支持更多参数、添加认证中间件(如果需要限制访问)、记录请求日志等功能。
- 错误响应的JSON格式化:目前错误时返回的是文本,也可以修改API,在出错时返回JSON格式的错误信息,便于VBA解析。
- 批量生成:VBA代码可以很容易地放入循环中,遍历一个单元格区域,为每个单元格的值生成一个条形码并插入到相邻单元格。
这个详细的方案能帮助在Armbian上成功部署条形码API并通过VBA调用!