如何使用Express post route将客户端重定向到新页面?

时间:2018-05-22 20:05:36

标签: javascript node.js express

我正在尝试构建一个节点/快速webapp,我点击一个按钮,将<div>转换成pdf,zip和密码保护pdf,通过电子邮件发送给收件人,最后生成一个新的带有pdf的页面,所以我可以看到它正确呈现。

除了生成pdf的预览外,我还能正常工作。我对节点和http路由一般都是新手,所以我知道我遗漏了一些明显的东西。

表单成功将<div>发送到服务器,服务器将其转换,压缩并成功邮寄。它还将pdf的副本保存在/public/pdfs目录中。我确实要为静态目录包含app.use(express.static(path.join(__dirname, 'public')));。我可以通过直接在浏览器中输入pdf来查看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 :(得分:0)

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

答案 1 :(得分:0)

嗯,事实证明这是一个时间问题。我在window.location命令周围放了一个2秒的超时函数,现在它可以工作了。

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

我尝试了1秒,但仍然遇到了同样的错误,所以事实证明wkhtmltopdf只需要不到2秒的时间来渲染文件。