You need to enable JavaScript to run this app. Node.js 实现向Excel写入任务的REST API POST接口开发求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.11 23:15:02