Как перенаправить клиента на новую страницу с помощью экспресс-маршрута? - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь создать узел / экспресс-веб-приложение, в котором я нажимаю кнопку, которая превращает <div> в pdf, zip и пароль защищают pdf, отправляют его по электронной почте получателю и в конце создают новую страницу сPDF, так что я вижу, что он отображается правильно.

У меня все работает, кроме генерации предварительного просмотра PDF.Я довольно плохо знаком с узлами и маршрутами http в целом, поэтому я знаю, что мне не хватает чего-то очевидного.

Форма успешно отправляет <div> на сервер, сервер преобразует его, архивирует и отправляет по почтеуспешно.Он также сохраняет копию файла PDF в каталоге /public/pdfs.Я действительно включил app.use(express.static(path.join(__dirname, 'public'))); для статических каталогов.Я могу получить доступ к файлу PDF, напрямую набрав его в браузере, но не могу загрузить его автоматически после отправки на сервер.

В окне браузера отображается:

Cannot GET /pdfs/2018_5_5_wj.pdf

В консоли браузера отображается:

Failed to load resource: the server responded with a status of 404 (Not Found)

Refused to apply a stylesheet because its hash, its nonce, or 'unsafe-inline' appears in neither the style-src directive nor the default-src directive of the Content Security Policy.

Я могу просто обновить страницу, и она прекрасно отображает PDF в браузере.Есть ли какая-то проблема синхронизации между отправкой перенаправления (которое происходит мгновенно) и генерацией pdf (которое занимает несколько миллисекунд)?

(клиент)

$("#testPostButton").click(function () {
    fileName = fileNamer();
    var formText = $("#formText").html();
    $.ajax({
        url: '/', 
        type: 'POST', 
        contentType: 'application/json', 
        data: JSON.stringify({formText:formText,fileName:fileName}),
        success: function(data) {
           console.log(data.fileURL);
           setTimeout(function(){window.location = data.fileURL},2000);      
        }
    });             
});

(сервер)

app.post('/', function (req, res) {
    //console.log(req.body);
    formText = req.body['formText'];
    fileName = req.body['fileName'];
    console.log(fileName)
    //console.log(formText);
    var wkhtmltopdf = require('wkhtmltopdf');
    options = {
        'page-size': 'Letter',
        'margin-top': '0.75in',
        'margin-right': '0.75in',
        'margin-bottom': '0.75in',
        'margin-left': '0.75in',
        'encoding': "UTF-8",
        'dpi': 800,
        'output': './public/pdfs/' + fileName,
    };
    wkhtmltopdf(formText, options);

    console.log('pdf generated');

    zipName = zipFile(fileName);
    console.log('zip generated:' + zipName);

    emailFile();


    var data = JSON.stringify({fileURL:'http://localhost:3000/pdfs/'+fileName});
    res.contentType('application/json');
    res.header('Content-Length', data.length);
    res.end(data);

});

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Ну, оказывается, это была проблема с синхронизацией.Я поместил 2-секундную функцию тайм-аута вокруг команды window.location, и теперь она работает.

setTimeout(function(){window.location = data.fileURL},2000);

Я пробовал 1 секунду, но все еще получал ту же ошибку, поэтому оказывается, что wkhtmltopdf занимает менее 2 секунд для рендеринга файла.

0 голосов
/ 22 мая 2018

res.header ('Location', 'example.com/redirect_location');

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...