Ошибка загрузки PDF-файла по указанной ссылке в node JS - PullRequest
0 голосов
/ 23 апреля 2020

Я создаю Утилиту, где я выбираю данные для всех поставщиков из базы данных. Затем, используя [asyn c .eachLimit (data, 1, asyn c (obj, key) =>]), мы go переходим в раздел один за другим, где он переходит в данный раздел и далее.

Теперь для одного указанного c клиента мы запускаем утилиту следующим образом:

1). Получить данные. 2). Создать журнал транзакции ID. 3). Генерация случайного порядкового номера. 4). Отправка коллективных данных третьей стороне. 5). Получите данные в ответ, где мы также получим ссылку для скачивания в формате PDF. 6). Мы обновляем базу данных с помощью Response и помечаем как «Y».

7). Теперь на этом этапе начните выпуск, где мы должны преобразовать эту URL-ссылку PDF в base64 и сохранить ее в нашей базе данных.

Я перепробовал много готовых пакетов, которые либо загружают PDF, либо могут напрямую преобразовать его в base64.

Я работаю под управлением прокси-сервера в организации.

Когда я передаю ссылку, полученную в ответ от третьей стороны, она не может загрузить PDF. Но когда я пытаюсь дать абсолютный URL-адрес ссылки и передать его, он работает для одного PDF, но для другого l oop, он генерирует поврежденный PDF размером 1 КБ.

Вот код, который я использовал для справки:

1) Индекс. js

const { logger } = require('./utilities');
const async = require('async');
var loggerString = ` [${__filename}]`;

const getDataFromDb = require('./mySQLCalls/getDataFromDbMaster');
const generateLogTxnId = require('./utilities/generateLogTxnId');

const updateDataforBank = require('./mySQLCalls/updateDataForBank');
const generatePDFbase64 = require('./mySQLCalls/generatePDFbase64');

const sendDataToBank = require('./thirdPartyApiCalls/sendDataToBank');
const randomSeq = require('./mySQLCalls/getRandomSequence');


getDataFromDb()
.then(data => {
    console.log("I am in data check----------->");
    if(data.length > 0) {
        console.log("I have data");
    return utilDataPushFunction(data);    
} else {
    logger.info("No Data Found");
    process.exit();
}
})
.then(res => {
    logger.info(res);

    process.exit();
})
.catch(err => {
    logger.error(`${loggerString} ${err}`);
    process.exit();
})

function utilDataPushFunction(data){

    logger.info(`${loggerString} length of the request > ${data}`);
    return new Promise((resolve, reject) => {

        async.eachLimit(data, 1, async (obj, key) => {


            try {


                if(obj.requiredName=='XYZ bank') {  

                   let logTxnId = await generateLogTxnId();
                   let randomSeqNo = await randomSeq(logTxnId);
                   let bankObj = await sendDataToBank(obj,logTxnId,randomSeqNo);                  
                   let updateDataforBankObj = await  updateDataforBank(obj,bankObj,logTxnId);
                   let generatePDFbase64Obj = await generatePDFbase64(obj,bankObj,logTxnId);
                   //let updatePDFbase64Obj = await updatePDFbase64(generatePDFbase64Obj,logTxnId);                    
                }
                else {
                    logger.info(`${loggerString} No matching partner record found for > ${obj}`);
                            return Promise.resolve();
                        }
                        return Promise.resolve();
            }
            catch (error) {
                logger.error(error);
                return Promise.reject(error);
            }
        }, error => {
            console.log("after execution ");
            if(error){
                console.log(error);
            }
            return resolve("successful");
        })
    })

    }

2). sendDataToBank. js

Нет необходимости предоставлять больше данных, так как он работает хорошо, и мы разрешаем ответ следующим образом.

    return resolve({
                            status: "Success",
                            abc: decryptObj[0],
                            thankUPageUrl: decryptObj[1],
                            downloadPDFUrl: decryptObj[2],
                            customerId: decryptObj[3],
                            pdfMIFDownloadUrl: decryptObj[4],
                            premiumPayable: body.metaData.premiumPayable
                        });

3). updateDataforBank. js

    const pool = require('./connectionPool').getPool();
const logger = require('../utilities');
const query = { My Table Update -----> };

module.exports = (record, updateData, logTxnId) => {

    var loggerString = `[${__filename}] [${logTxnId}]`;

    return new Promise((resolve, reject) => {

        if (updateData.status == 'Success') {
            pool.query(query[updateData.status], [updateData.status,JSON.stringify(updateData),updateData.abc,updateData.customerId,record.id], (err, results, fields) => {

                if (err) {
                    logger.error(`${loggerString} Error occured in retrieving data :${err}`);
                    return resolve();                   
                }                

                console.log('PDF URL ---------------> '+ updateData.downloadPDFUrl);                
                return resolve(results);

            })
        } else if (updateData.status == 'Failure') {
            pool.query(query[updateData.status], [updateData.status, JSON.stringify(updateData), record.id], (err, results, fields) => {

                if (err) {
                    logger.error(`${loggerString} Error occured in retrieving data :${err}`);
                    return resolve();
                }
                logger.info(`Data Inserted successfully for Error`);
                console.log("Data Inserted successfully======>", results);
                return resolve(results);

            })
        }


    })    

}

4). generatePDFbase64. js

    const axios = require('axios-https-proxy-fix');
const Fs = require("fs");

const proxy = {
    host: 'proxyServerHostName',
    port: 8080,
    auth: {
      username: 'UserID',
      password: 'p@$$w0rD'
    }
  };


const { logger } = require('../utilities');

const async = require('async');


module.exports = (record,updateData, logTxnId) => {

    var pdfsourcepath = 'C:/Users/XXXXXX/Desktop/BANK/somePDF_'+logTxnId+'.pdf';
    var loggerString = `[${__filename}] [${logTxnId}]`;

    logger.debug(`${loggerString} Inside Update - Logger ${updateData}`);

    return new Promise((resolve, reject) => {

        if (updateData.status == 'Success') {

            downloadPDF(updateData.downloadPDFUrl,logTxnId);

            async function downloadPDF(pdfURL,logTxnId) {

                var url = pdfURL;
                var path = pdfsourcepath;
                var writer = Fs.createWriteStream(path);

                var response = await axios({
                    url,
                    method: 'GET',
                    responseType: 'stream',
                    proxy,
                  })


              response.data.pipe(writer);    

             return resolve();
            }


        }
        else if(updateData.status == 'Failure') {
            return resolve();
        }

    })
}

Моя основная цель - сначала сгенерировать pdf, а затем преобразовать его в base64, используя "pdf-to-base64". Поэтому я не упомянул шаг base64, так как я не могу получить весь PDF.

, когда я запускаю его независимо, он загружается и генерируется для одного, когда я внедряю его в этот код утилиты и запускаю его. Не получается.

Если у кого-то есть другие идеи, пожалуйста, дайте мне тоже.

...