AIGlasses_for_navigation开发环境配置:Node.js安装及后端服务框架搭建
AIGlasses_for_navigation开发环境配置Node.js安装及后端服务框架搭建如果你对智能硬件和AI应用开发感兴趣想自己动手搭建一个能为智能眼镜提供导航服务的后端系统那么这篇文章就是为你准备的。我们将从零开始一步步完成Node.js环境的安装并基于它搭建一个功能完整的后端服务框架。这个框架将负责接收智能眼镜拍摄的环境图像调用AI模型进行推理并将计算出的导航路径实时推送给前端。整个过程不需要你事先有深厚的后端开发经验我会用最直白的方式讲清楚每一步。1. 准备工作与环境搭建在开始敲代码之前我们需要先把“舞台”搭好。这个舞台就是Node.js运行环境。你可以把它理解为一台能让JavaScript代码在电脑上运行起来的“发动机”。1.1 安装Node.js与npmNode.js的安装非常简单几乎是一键式的。我们推荐从官方网站下载长期支持版本这样更稳定。首先打开你的浏览器访问Node.js的官方网站。找到下载页面选择与你的操作系统匹配的安装包。对于Windows和macOS用户直接下载.msi或.pkg安装文件双击运行跟着安装向导的提示点击“下一步”即可。安装过程中请务必勾选“自动安装必要的工具”或类似选项这会把npmNode包管理器一并装上。对于使用Linux系统的朋友可以通过包管理器来安装。例如在Ubuntu或Debian上你可以打开终端输入以下命令curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt-get install -y nodejs安装完成后我们需要验证一下是否成功。打开你的终端或命令提示符输入以下两条命令node --version npm --version如果终端分别显示了类似v18.x.x和9.x.x的版本号那么恭喜你Node.js和npm已经成功安装到你的电脑上了。npm是随Node.js附赠的“应用商店”我们后面安装各种代码库都要靠它。1.2 初始化你的项目环境准备好了现在来创建我们的项目“工地”。找一个你喜欢的文件夹比如在桌面上新建一个名为ai-glasses-backend的目录。然后打开终端进入到这个目录cd ~/Desktop/ai-glasses-backend接下来我们要在这个空目录里初始化一个Node.js项目。运行下面的命令npm init -y这个命令会快速生成一个名为package.json的文件它就像是项目的“身份证”和“购物清单”记录了项目的基本信息以及后续需要安装的各类工具库我们称之为依赖包。打开这个文件看看里面已经有一些基础信息了。2. 构建后端服务核心框架有了项目骨架接下来我们要给它装上“心脏”和“骨骼”也就是选择一个Web框架并搭建起基本的服务器结构。2.1 选择并安装Web框架在Node.js的世界里Express和Koa是两个非常流行且易用的Web框架。它们能帮我们轻松处理HTTP请求和响应。对于新手来说Express的文档和社区资源更丰富学习曲线更平缓所以我们这次以Express为例。当然如果你之后想尝试更现代的异步处理方式Koa也是个很棒的选择。在项目根目录下运行以下命令来安装Expressnpm install express稍等片刻npm就会从网络仓库把Express框架下载并安装到项目的node_modules文件夹里。同时package.json文件中会自动添加对Express的依赖记录。2.2 创建你的第一个服务器现在让我们来写第一行真正有意义的代码。在项目根目录下创建一个新文件命名为app.js。用任何你喜欢的文本编辑器或代码编辑器比如VSCode打开它。首先我们需要把Express框架“请”进来。在app.js文件的开头写入const express require(express);这行代码的意思是我要使用一个叫express的工具包。接下来我们调用这个工具包创建一个应用实例这将是我们的服务器核心const app express();为了让我们的服务器能理解前端发送过来的JSON格式的数据比如配置信息以及能处理文件上传我们需要给这个应用添加一些“中间件”。中间件可以理解为请求到达核心处理逻辑之前需要经过的一系列“检查站”或“加工厂”。// 解析JSON格式的请求体 app.use(express.json()); // 解析URL编码格式的请求体通常来自表单提交 app.use(express.urlencoded({ extended: true }));最后我们需要告诉服务器在哪个“端口”上监听请求并启动它。端口就像门牌号客户端比如浏览器或智能眼镜应用通过这个门牌号来访问我们的服务。const PORT process.env.PORT || 3000; app.listen(PORT, () { console.log(后端服务已启动正在监听 http://localhost:${PORT}); });保存文件回到终端在项目目录下运行node app.js如果看到终端打印出“后端服务已启动正在监听 http://localhost:3000”的消息那么你的第一个Node.js服务器就已经在本地运行起来了你可以打开浏览器访问http://localhost:3000虽然目前只会看到一个“Cannot GET /”的错误页面因为我们还没定义路由但这证明服务器确实在正常工作。按CtrlC可以停止服务器。3. 设计核心功能接口服务器跑起来了但它现在还什么都做不了。接下来我们要为它赋予“灵魂”即实现AIGlasses_for_navigation项目需要的几个核心功能接收图片、处理请求、返回结果。3.1 处理文件上传智能眼镜需要把拍到的环境图片传给我们。这里我们需要一个专门的工具来处理文件上传。multer是一个常用的中间件。先安装它npm install multer然后在app.js中引入并配置它。我们计划把上传的图片暂时存放在一个叫uploads/的文件夹里。const multer require(multer); const path require(path); // 确保上传目录存在 const fs require(fs); const uploadDir uploads; if (!fs.existsSync(uploadDir)){ fs.mkdirSync(uploadDir); } // 配置multer存储到uploads文件夹保留原始文件名 const storage multer.diskStorage({ destination: function (req, file, cb) { cb(null, uploadDir) }, filename: function (req, file, cb) { // 用时间戳重命名文件避免重名 const uniqueSuffix Date.now() - Math.round(Math.random() * 1E9); cb(null, file.fieldname - uniqueSuffix path.extname(file.originalname)); } }); const upload multer({ storage: storage });现在我们可以创建一个接收图片的接口了。假设前端通过/api/upload这个地址以image为字段名上传图片app.post(/api/upload, upload.single(image), (req, res) { // req.file 包含了上传文件的信息 if (!req.file) { return res.status(400).json({ error: 请上传有效的图片文件。 }); } const imagePath req.file.path; console.log(图片已上传至: ${imagePath}); // 这里先简单返回成功消息后续会在这里调用AI模型 res.json({ message: 图片上传成功, filePath: imagePath }); });3.2 调用Python模型进行推理我们的导航算法很可能用Python编写例如使用TensorFlow/PyTorch。Node.js可以通过创建子进程的方式来调用Python脚本。我们需要安装一个辅助库来更安全、更方便地执行系统命令npm install shelljs假设我们有一个Python脚本navigation_model.py它接收一个图片路径作为参数运行AI模型并输出导航路径信息例如一个路径点列表的JSON字符串。我们在app.js中引入shelljs并修改上传接口在上传成功后调用这个Python脚本const shell require(shelljs); // 在上传接口的回调函数中添加调用Python模型的逻辑 app.post(/api/upload, upload.single(image), (req, res) { if (!req.file) { return res.status(400).json({ error: 请上传有效的图片文件。 }); } const imagePath req.file.path; console.log(开始处理图片: ${imagePath}); // 调用Python子进程 // 假设你的python命令就是python如果你的环境是python3请相应修改 const pythonScriptPath ./scripts/navigation_model.py; const command python ${pythonScriptPath} --image ${imagePath}; shell.exec(command, { silent: false }, (code, stdout, stderr) { if (code ! 0) { console.error(模型推理失败: ${stderr}); return res.status(500).json({ error: 模型处理失败, detail: stderr }); } console.log(模型推理成功输出: ${stdout}); try { // 假设Python脚本打印到stdout的是一个JSON字符串 const navigationData JSON.parse(stdout); // 此时navigationData包含了路径信息 // 我们先返回给HTTP请求后续会改为WebSocket推送 res.json({ message: 导航路径生成成功, data: navigationData }); } catch (parseError) { console.error(解析模型输出失败:, parseError); res.status(500).json({ error: 处理模型输出时出错 }); } }); });注意你需要提前准备好navigation_model.py脚本并确保它在指定的路径下。这个Python脚本需要能通过命令行参数接收图片路径并打印出JSON格式的推理结果。4. 实现实时导航路径推送HTTP接口是一次性的请求-响应但导航路径的生成可能需要一定时间并且我们可能希望持续向眼镜端发送更新。这时WebSocket就派上用场了它能建立一条持久的双向通信通道。4.1 集成WebSocket服务我们使用流行的ws库来创建WebSocket服务。首先安装它npm install ws然后我们需要修改app.js让HTTP服务器和WebSocket服务器共享同一个端口。这通常需要直接使用Node.js内置的http模块来创建服务器。const http require(http); const WebSocket require(ws); // 创建HTTP服务器并将Express应用作为请求处理器 const server http.createServer(app); // 创建WebSocket服务器将其附加到HTTP服务器上 const wss new WebSocket.Server({ server }); // 监听WebSocket连接 wss.on(connection, function connection(ws) { console.log(新的客户端已通过WebSocket连接); // 当收到客户端消息时 ws.on(message, function incoming(message) { console.log(收到客户端消息: %s, message); // 这里可以处理客户端发来的指令例如开始导航、停止导航等 }); // 当连接关闭时 ws.on(close, () { console.log(客户端已断开WebSocket连接); }); // 可以向客户端发送一条欢迎消息 ws.send(JSON.stringify({ type: connection, message: WebSocket连接已建立 })); }); // 修改服务器启动方式 const PORT process.env.PORT || 3000; server.listen(PORT, () { console.log(服务已启动在 http://localhost:${PORT}); });4.2 将推理结果推送给前端现在我们需要改造之前的图片处理流程。当AI模型生成导航路径后不再通过HTTP响应返回而是通过WebSocket广播给所有连接的客户端比如智能眼镜的前端界面。我们需要一个方法来管理所有连接的WebSocket客户端并在模型推理完成后通知它们。修改WebSocket连接处理部分和上传接口// 存储所有连接的客户端 const clients new Set(); wss.on(connection, function connection(ws) { console.log(新的客户端已连接); clients.add(ws); // 新连接加入集合 ws.on(close, () { console.log(客户端已断开连接); clients.delete(ws); // 连接关闭时从集合移除 }); // ... 其他 message 事件处理 }); // 一个用于向所有客户端广播消息的函数 function broadcastNavigationData(data) { const message JSON.stringify({ type: navigation_path, data: data }); clients.forEach(client { if (client.readyState WebSocket.OPEN) { client.send(message); } }); } // 修改上传接口将结果通过WebSocket推送 app.post(/api/upload, upload.single(image), (req, res) { if (!req.file) { return res.status(400).json({ error: 请上传有效的图片文件。 }); } const imagePath req.file.path; console.log(开始处理图片并准备实时推送: ${imagePath}); // 立即响应HTTP请求告知已开始处理 res.json({ message: 图片接收成功正在生成导航路径请等待实时推送... }); // 异步调用Python模型 const pythonScriptPath ./scripts/navigation_model.py; const command python ${pythonScriptPath} --image ${imagePath}; shell.exec(command, { silent: false }, (code, stdout, stderr) { if (code ! 0) { console.error(模型推理失败: ${stderr}); broadcastNavigationData({ error: 模型处理失败 }); return; } console.log(模型推理成功准备推送结果); try { const navigationData JSON.parse(stdout); // 通过WebSocket广播导航数据 broadcastNavigationData(navigationData); } catch (parseError) { console.error(解析模型输出失败:, parseError); broadcastNavigationData({ error: 处理模型输出时出错 }); } }); });这样前端在上传图片后会立即收到一个HTTP响应然后保持WebSocket连接等待导航数据的推送。一旦后端处理完成所有在线的客户端都会实时收到最新的导航路径。5. 项目完善与运行测试框架和核心功能都完成了我们还需要做一些收尾工作让项目更健壮、更好用。5.1 添加请求日志与错误处理一个好的服务需要有“眼睛”和“安全网”。我们添加一个简单的日志中间件来记录所有请求并添加一个兜底的错误处理中间件。在app.js中所有路由定义之前添加日志中间件// 简易请求日志中间件 app.use((req, res, next) { console.log([${new Date().toISOString()}] ${req.method} ${req.url}); next(); // 继续处理下一个中间件或路由 });在所有路由定义之后添加一个404处理和一个错误处理中间件// 处理404 - 没有匹配的路由 app.use((req, res, next) { res.status(404).json({ error: 抱歉您访问的接口不存在。 }); }); // 全局错误处理中间件 app.use((err, req, res, next) { console.error(服务器内部错误:, err.stack); res.status(500).json({ error: 服务器内部发生错误请稍后再试。 }); });5.2 使用nodemon提升开发体验在开发过程中每次修改代码都需要手动停止再重启服务器很麻烦。nodemon工具可以监视文件变化自动重启服务。首先将它安装为开发依赖npm install --save-dev nodemon然后修改package.json文件中的scripts部分scripts: { start: node app.js, dev: nodemon app.js }现在你可以在终端运行npm run dev来启动开发服务器。之后每次保存app.js或其他文件服务器都会自动重启无需你手动操作。5.3 完整测试流程让我们把整个流程串起来测试一下启动服务在项目根目录下运行npm run dev。测试文件上传你可以使用Postman或curl工具来测试/api/upload接口。在Postman中创建一个POST请求地址为http://localhost:3000/api/upload。在Body选项卡中选择form-data添加一个key为image必须与代码中upload.single(image)的参数一致类型为File的字段并选择一张本地图片。发送请求你应该会立即收到{“message”: “图片接收成功正在生成导航路径...”}的响应。测试WebSocket连接你可以使用在线的WebSocket测试客户端或者写一个简单的前端页面。连接地址是ws://localhost:3000。连接成功后会收到服务端发来的欢迎消息。当你通过HTTP接口上传图片后如果Python脚本模拟成功你应该能在WebSocket客户端看到推送过来的导航数据消息。6. 总结与后续方向跟着上面的步骤走一遍一个具备核心功能的AIGlasses_for_navigation后端服务框架就搭建起来了。它能够接收图像调用AI模型并通过WebSocket实现实时数据推送。整个过程涉及了Node.js环境搭建、Express框架使用、文件处理、子进程调用和实时通信算是把Web后端开发中几个常见的知识点都串了一遍。当然这只是一个起点。在实际项目中你还需要考虑更多东西比如如何安全地管理Python环境依赖可以考虑用Docker容器化如何对上传的图片进行格式和大小校验如何设计更完善的WebSocket协议区分不同类型的消息以及如何将服务部署到云服务器上。数据库的集成用于保存历史路径或用户数据和用户认证也是常见的下一步。不过别担心先把眼前这个能跑通的版本玩熟那些更高级的功能都可以在此基础上一步步添加。动手试试吧遇到问题多查查文档和社区你会发现其实并没有想象中那么难。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。