基于MERN栈+Xero-node SDK按跟踪类别过滤Xero发票的问题
按Xero跟踪类别过滤发票的解决方案
核心问题分析
你遇到的lineItems为空的问题,是因为Xero API默认不会返回发票的行项目详细数据,必须显式指定参数才能获取包含跟踪类别的行项目。另外你之前用contact.name过滤是完全错误的,跟踪类别和客户名称是两个独立的字段。
步骤1:修正API调用,获取包含跟踪类别的数据
调用getInvoices时必须添加includeLineItems: true参数,否则返回的lineItems会是空数组:
let allInvoices = await xero.accountingApi.getInvoices(tenantID, { includeLineItems: true }); allInvoices = allInvoices.body.invoices;
步骤2:正确按项目跟踪类别过滤发票
Xero的跟踪类别可能存在两个位置:发票全局的tracking字段(针对整单的跟踪类别),或者行项目lineItems里的trackingCategories字段(针对单个行项目的跟踪类别)。你需要同时检查这两个位置,确保不会遗漏:
const targetProjectCategory = "你的项目类别名称"; // 替换为实际项目类别名称 const startDate = new Date("2021-01-01"); // 替换为你的起始日期 const endDate = new Date("2021-12-31"); // 替换为你的结束日期 // 过滤包含指定项目跟踪类别的发票 const invoicesWithTargetCategory = allInvoices.filter(invoice => { // 检查发票级别的全局跟踪类别 if (invoice.tracking?.length) { const hasMatch = invoice.tracking.some(track => track.name === targetProjectCategory); if (hasMatch) return true; } // 检查每个行项目的跟踪类别 if (invoice.lineItems?.length) { return invoice.lineItems.some(lineItem => lineItem.trackingCategories?.some(track => track.name === targetProjectCategory) ); } return false; }); // 按到期日期过滤 const filteredInvoices = invoicesWithTargetCategory.filter(invoice => { const dueDate = new Date(invoice.dueDate); return dueDate >= startDate && dueDate <= endDate; });
关键说明
includeLineItems是必填参数,没有它Xero只会返回发票的基础信息,不会包含行项目和跟踪类别数据。- 用可选链操作符
?.避免空值报错,比如当发票没有跟踪类别或行项目时不会抛出错误。 - 日期比较必须转为
Date对象,直接用字符串比较可能会出现逻辑错误。
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

