使用 Meteor 和 Iron Router 渲染 PDF

Rendering a PDF using Meteor and Iron Router

本文关键字:渲染 PDF Router Iron Meteor 使用      更新时间:2023-09-26

我有一个pdf文件位于这里:

/

server/.files/users/test.pdf

当我在页面上显示链接时,我希望用户能够单击该链接,并在屏幕上呈现pdf。

我已经通读了这个特别的SO帖子,以及其他帖子,但似乎无法让事情发挥作用:SO Link

我尝试使用 IR 路由服务器端,但每次尝试简单的事情时,我都会收到以下错误:

Error: Meteor.userId can only be invoked in method calls. Use this.userId in publish functions. at Object.Meteor.userId

(packages/accounts-base/accounts_server.js:19:1) at Object.Meteor.user (packages/accounts-base/accounts_server.js:24:1) at [object 对象]。Router.onBeforeAction.except (应用程序/两者/3 路由器/路由.js:10:15) 在 packages/iron:router/lib/router.js:277:1 at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1) at [object Object].hookWithOptions (packages/iron:router/lib/router.js:276:1) at boundNext (packages/iron:middleware-stack/lib/middleware_stack.js:251:1) at runWithEnvironment (packages/meteor/dynamics_nodejs.js:108:1) at packages/meteor/dynamics_nodejs.js:121:1 at [object Object].dispatch (包/熨斗:中间件堆栈/lib/middleware_stack.js:275:1)

行:#10 在我的路由器中.js文件是这里的第一个if语句:

Router.onBeforeAction(function () {   
   if (!Meteor.user() || Meteor.loggingIn()) {
    this.redirect('welcome.view');   }   else {
    Meteor.call("userFileDirectory", function (error, result) {
      if (error)
        throw error;
      else
        console.log(result);
    });
    this.next();   
 } }, {   except: ['welcome.view'] });

我试过这个:

Router.map(function() {
    this.route('serverFile', {
        where: 'server',
        path: /^'/uploads_url_prefix'/(.*)$/,
        action: function() {
           var filePath = process.env.PWD + '/.files/users/' + this.params[1];
           var data = fs.readFileSync(filePath);
           this.response.writeHead(200, {
                'Content-Type': 'image'
           });
           this.response.write(data);
           this.response.end();
        }
    }); });

但我不确定该在路径中放什么。

使用 process.env.PWD,您将进入流星项目的目录。因此,您应该能够像这样访问您的文件:

var file = process.env.PWD + "/server/.files/users/test.pdf"

要使用节点的 fs 包,您还需要包含它,并且您需要在服务器上:

Router.route('/pdf', function() {
    var filePath = process.env.PWD + "/server/.files/users/test.pdf";
    var fs = Meteor.npmRequire('fs');
    var data = fs.readFileSync(filePath);
    this.response.write(data);
    this.response.end();
}, {
    where: 'server'
});

确保将此包到您的项目 (https://atmospherejs.com/meteorhacks/npm)

meteor add meteorhacks:npm

我测试了它,它就像一个魅力!