«RequestError: Ошибка: неверный URI» при загрузке файла в облачный анализ - PullRequest
0 голосов
/ 04 июля 2019

Я использую этот пример кода из parse javascript sdk в main.js моего электронного приложения, он отлично работает с примером URI, но когда я использую свой собственный URI, который находится в локальном файле на уровне маршрутамое приложение, я получаю следующее сообщение RequestError,

Ошибка: неверный URI.

URI, который я пытаюсь использовать: file://${__dirname}/tempInv.pdf Я пробовал все разные вариантыадрес файла, который я могу придумать, но результат все тот же.Есть ли какой-то способ указать на localhost, возможно, что бы обойти эту ошибку.Приложение будет развернуто, поэтому оно должно работать на разных платформах.

const request = require('request-promise');
const Parse = require('parse/node');

....

const options = {
  uri: 'https://-----/-----',
  resolveWithFullResponse: true,
  encoding: null, // <-- this is important for binary data like images.
};

request(options)
  .then((response) => {
    const data = Array.from(Buffer.from(response.body, 'binary'));
    const contentType = response.headers['content-type'];
    const file = new Parse.File('logo', data, contentType);
    return file.save();
  })
  .then((file => console.log(file.url())))
  .catch(console.error);
const Parse = require('parse/node');

const express = require('express');
const XeroClient = require('xero-node').AccountingAPIClient;
const config = require('./config.json');

const fs  = require('fs');

const request = require('request-promise');

let appEx = express();

let lastRequestToken = null;
let xeroClient = new XeroClient(config);


appEx.set('port', 3000)

ipcMain.on('message-createInvoice', function (event, data) {

    let win = new BrowserWindow({ width: 340, height: 480 });
        win.setPosition(0, 0);
        win.loadURL('http://localhost:3000/');

    appEx.get('/', async function(req, res) {

        lastRequestToken = await xeroClient.oauth1Client.getRequestToken();
        let authoriseUrl = xeroClient.oauth1Client.buildAuthoriseUrl(lastRequestToken);

        res.redirect(authoriseUrl);

    })   


    appEx.get('/callback', async function(req, res) {

        let oauth_verifier = req.query.oauth_verifier;
        let accessToken = await xeroClient.oauth1Client.swapRequestTokenforAccessToken(lastRequestToken, oauth_verifier)
            .then(async() => {
                var invoice = await xeroClient.invoices.create(data)           
                    .then((invoice) => {
                        var inv = invoice["Invoices"][0];
                        var invId = inv["InvoiceID"];

                        xeroClient.invoices.savePDF({ InvoiceID: invId, savePath: path.join(__dirname, '../temp-files/temp-inv.pdf',)})
                            .then(() => {

                                Parse.initialize("--appId--");    
                                Parse.serverURL = 'http://--.---.--.---:80/parse';

                                const data = fs.readFileSync(path.join(__dirname, '../temp-files/temp-inv.pdf'));

                                const file = await new Parse.File('inv.pdf', [...data]);
                                return file.save()
                                    .then((file) => {
                                        var Invoices = Parse.Object.extend("Invoices");
                                        var invoice = new Invoices;
                                        invoice.set('invPdf', file);
                                        invoice.save();     
                                        event.returnValue = true;
                                        win.close();
                                    })
                                    .catch((err) => {
                                    console.log('Failed to save invoice to Parse Cloud: ' + err);
                                    event.returnValue = false;
                                    win.close();
                                    })

                            })
                            .catch((err) => {
                            console.log('Failed to save invoice to temp-file: ' + err);
                            event.returnValue = false;
                            win.close();
                            })
                    })
                    .catch((err) => {
                    console.log('Failed to create invoice in xero' + err);
                    event.returnValue = false;
                    win.close();
                    })
            })
            .catch((err) => {
                console.log('Oauth failed' + err);
                event.returnValue = false;
                win.close();
            })
    })

    event.sender.send('message-createInvoice', true);

});


appEx.listen(appEx.get('port'), function() {
    console.log("Your Xero basic public app is running at http://localhost:" + appEx.get('port'))
})

1 Ответ

0 голосов
/ 05 июля 2019

Я думаю, что request-promise не лучший способ прочитать локальный файл. Я рекомендую вам использовать fs пакет. Было бы что-то вроде этого:

const path = require('path');
const fs = require('fs');
const Parse = require('parse/node');

....

const data = fs.readFileSync(path.join(__dirname, './tempInv.pdf'));
const file = new Parse.File('logo.pdf', [...data]);
file.save()
  .then(file => console.log(file.url()))
  .catch(console.error);
...