Добавить вложения в счета в Xero, используя node js SDK или API - PullRequest
1 голос
/ 29 апреля 2020

Я пытаюсь добавить вложения к существующим счетам в xero.

Я использую xero-node sdk (https://github.com/XeroAPI/xero-node#readme) для этой интеграции, и они предоставляют метод для добавления вложения следующим образом:

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

Проблема здесь заключается в том, что для readStream требуется объект fs.ReadStream.

Файл, который я пытаюсь загрузить, присутствует в облаке, и я не могу загрузить его и сохранить это в файловой системе перед отправкой в ​​Xero. Я хочу отправить файл в облаке azure напрямую в xero. У меня есть URL файла, поэтому я могу получить содержимое в виде переменной, отправив запрос http, но нет возможности отправить это содержимое в Xero.

Для этого также доступен API (здесь https://developer.xero.com/documentation/api/attachments) кроме СДК. Но я не уверен, как я могу отправить файл, который у меня есть, этому API в теле, поскольку он ожидает RAW-данные. Существуют ли какие-либо определенные c заголовки или кодировки, необходимые для вызова этого API с содержимым файла в теле? Потому что это также не работает для меня, если я просто передаю тело ответа, полученного из azure url файла, как тело к этому API Xero Attachment. Он пытается долго и выдает ошибку тайм-аута.

1 Ответ

0 голосов
/ 29 апреля 2020

да, вы правы. Существуют дополнительные заголовки / манипуляции, которые необходимо выполнить для загрузки файлов.

Пожалуйста, ознакомьтесь с примером приложения - мы поставили его в очередь, чтобы показать, как именно загружать файлы: 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,
  },
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...