Node.js 实现向Excel写入任务的REST API POST接口开发求助
问题排查与修复方案
核心问题点
components/hello.js中直接使用了headerArray、firstTaskArray两个变量,但未在当前文件中定义,执行时会抛出ReferenceError- 内存中修改完Excel工作簿后,未调用
xlsx.writeFile将内容回写到物理文件,Excel文件不会有实际变更 - Promise执行逻辑未做异常捕获,文件读取失败、路径错误等问题无法正确传递到路由的错误处理环节
- 路由的错误响应写法不符合Express规范,
res.json(404, error)无法返回正确的404状态码和错误信息 - 接口返回的是xlsx工作表内部对象,转成JSON无实际业务意义
修复后代码
1. 组件层(components/hello.js)
补全变量定义、增加异常捕获、添加文件回写逻辑、移除无用依赖:
"use strict"; const xlsx = require('xlsx'); const Hello = { postHello: (taskData) => { return new Promise ((resolve, reject) => { try { // 可直接使用POST请求传入的任务数据替换写死的测试数据 const headerArray = ["Completed", "Id", "Task Name", "Description", "Due Date", "Priority", "Status", "Notes"]; const firstTaskArray = taskData || ["No", 1, "Soup", "broccoli, carrots, onion, and blend", new Date(2021, 12, 12), "Low", "Not Started", "Search for a tutorial"]; const cookingListData = [headerArray, firstTaskArray]; // 读取现有Excel文件 const workBook = xlsx.readFile("./todo-list.xlsx", { cellDates: true }); // 生成工作表并追加到工作簿 const cookingList = xlsx.utils.aoa_to_sheet(cookingListData); xlsx.utils.book_append_sheet(workBook, cookingList, "Do-Cooking"); // 必须执行回写操作,否则物理文件不会发生变更 xlsx.writeFile(workBook, "./todo-list.xlsx"); resolve("任务写入成功"); } catch (err) { reject(err); } }) } }; module.exports = Hello
2. 路由层(api/hello.js)
修复错误响应写法,优化返回逻辑:
const HelloRouter = require('express').Router(); const Hello = require('./../components/hello'); HelloRouter.post('/welcome', (req, res) => { // 直接将POST请求传入的任务数据传给组件层 Hello.postHello(req.body).then(message => { return res.json({ msg: message }); }).catch((error) => { // 先设置状态码,再返回错误信息 return res.status(500).json({ error: error.message }); }); }); module.exports = HelloRouter;
额外注意事项
- 确保代码执行路径下存在
todo-list.xlsx文件,或提前判断文件是否存在,不存在则自动创建 - 如果需要把新任务追加到已有工作表而非新建工作表,需要先读取原有工作表内容,追加新行后再回写,当前逻辑是每次请求都新建
Do-Cooking工作表,重复执行会出现重名报错
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

