繁体   English   中英

通过从Node.js和Express.js中的前端请求数据来创建动态链接

[英]Creating dynamic link by requesting data from front-end in Node.js and Express.js

这对我来说很难解释,但是我试图通过创建一个链接而不是50个链接来下载表单来缩短代码。 我将尝试使用我的代码更好地解释这一点。

我有5个get请求,它们执行的功能完全相同,但下载的文件不同。

router.get('/form1', function (req, res) {
    var file = __dirname + '/../public/forms/form1.pdf';
    res.download(file);
});

router.get('/form2', function (req, res) {
    var file = __dirname + '/../public/forms/form2.pdf';
    res.download(file); 
});
etc...

和我的前端链接是;

<a href="/downloads/form1">FORM 1</a>
<a href="/downloads/form2">FORM 2</a>
etc...

我能做些什么使它更具动态性吗? 我唯一能想到的就是这样。

router.get('/:formName', function (req, res) {
    // some how do a "req.params.formName" 
    var file = __dirname + '/../public/forms/' + req.params.formName + '.pdf';
    res.download(file); // Set disposition and send it.
});

但是我不知道如何获取formName,或者那是否有可能。

该响应假定您的路线位于index.js

router.get('/form/:formName', (req, res, next) => {
  res.download(`${__dirname}/../public/forms/${req.params.formName}.pdf`);
});

<a href="/form/form2">FORM 2</a>

小心自己的路。 我不知道您是否可以从目录开始,再上一个级别,然后再下一个。

这里有一些其他选项可以澄清:

  • 选项1:如果服务器上的文件夹具有可管理的目录结构,则只需使用express.static将物理文件夹映射到虚拟文件夹并自动下载:

     app.use('/download', express.static(path.join(__dirname, '/public/forms/'))) 

    只要该文件在服务器上您所映射的路径(即/ public / forms)中,这将导致来自前端的任何带有href ='/ download / something.pdf'的链接正常工作。

  • 选项2(上面的David E实质上回答了该问题):在您的原始代码中,如果您想为看起来像/ download / form1,/ download / form2的链接生成路径处理程序,这是一个非常小的修改:

     router.get('/download/:formNumber', function (req, res) { var file = __dirname + '/public/forms/' + req.params.formNumber + '.pdf'; res.download(file); }); 
  • 选项3:您想要验证对文件的访问,并可能支持对单个处理程序的多种复杂URL方案,这些处理程序可以查找适当的物理路径并发送文件:

     router.get('/download/:path[forms|images|files]/:formNumber1', fileRequestHandler); router.get('/public/downloadFolder2/:formNumber2', fileRequestHandler); router.get('/public/downloadFolder3/:formNumber3', fileRequestHandler); function fileRequestHandler(req, res) { // Check authentication here - example below from Passport if(!req.isAuthenticated()) return res.status(401).send({err: 'Unauthorized'}); // Check which form number is supplied and map to appropriate physical file if(req.params.formNumber1) { // in this example, req.params.path can be one of three allowed sample values - forms or images or files var file = __dirname + '/public/' + req.params.path + '/' + req.params.formNumber + '.pdf'; res.download(file); } else if(req.params.formNumber2) { // etc. } } 

注意: Ezra Chang关于路径有效性的观点很重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM