使用节点 js SDK 或 API 在 Xero 中将附件添加到发票

Add attachments to Invoices in Xero using node js SDK or API

我正在尝试将附件添加到 xero 中的现有发票。

我正在使用 xero-node sdk (https://github.com/XeroAPI/xero-node#readme) 进行此集成,他们提供了一种添加附件的方法,如下所示:

this.xero.accountingApi.createInvoiceAttachmentByFileName(tenantId, invoiceid, filenameInvoice,includeOnline,readStream )

这里的问题是 readStream 需要 fs.ReadStream object。

我要上传的文件存在于云中,我无法在发送到 Xero 之前将其下载并存储在文件系统中。我想将天蓝色云中存在的文件直接发送到 xero。我有文件的 url,所以我可以通过发出 http 请求将内容作为变量获取,但是没有将此内容发送到 Xero 的选项。

除了 sdk 之外,还有一个 API 可用于此(此处 https://developer.xero.com/documentation/api/attachments)。但是我不确定如何将我所拥有的文件发送到 body 中的 API,因为它需要 RAW 数据。使用 body 中的文件内容调用此 API 是否需要任何特定的 headers 或编码?因为如果我只是将我从 azure 文件 url 获得的响应的 body 作为 body 传递给此 Xero 附件 API,这对我也不起作用。它尝试了很长时间并给出了超时错误。

是的,你是对的。您还需要执行其他 headers/manipulation 操作才能上传文件。

请检查示例应用程序 - 我们已将其排队以准确显示如何上传文件:https://github.com/XeroAPI/xero-node-oauth2-app/blob/master/src/app.ts#L1188

像下面这样的东西应该让你排序:

import * as fs from "fs";

const path = require("path");
const mime = require("mime-types");


const totalInvoices = await xero.accountingApi.getInvoices('your-tenantId-uuid', undefined, undefined, undefined, undefined, undefined, undefined, ['PAID']);

// Attachments need to be uploaded to associated objects https://developer.xero.com/documentation/api/attachments

// CREATE ATTACHMENT
const filename = "xero-dev.png";
const pathToUpload = path.resolve(__dirname, "../path-to-your.png");
const readStream = fs.createReadStream(pathToUpload);
const contentType = mime.lookup(filename);

const fileAttached = await xero.accountingApi.createInvoiceAttachmentByFileName(req.session.activeTenant.tenantId, totalInvoices.body.invoices[0].invoiceID, filename, true, readStream, {
  headers: {
    "Content-Type": contentType,
  },
});

我最终将 link 添加到发票历史记录和注释部分的文件中。尽管这不是最好的解决方案,但它的目的是向客户显示发票。

感谢@SerKnight 的回答。