Meteor 中间件和服务器端路由

Meteor middleware and Server side routes

似乎在 Meteor 中,我们无法调用服务器端路由来将文件呈现到页面,而无需从我们的正常工作流程中进行某种变通,根据我对服务器端路由的了解。我希望我错了,有一种简单的方法可以实现我想要做的事情...

Software/Versions

我正在使用最新的 Iron Router 1.* 和 Meteor 1.* 并且开始时,我只使用帐户密码。

Background/Context

我有一个 onBeforeAction,它根据用户是否登录将用户重定向到欢迎页面或主页:

both/routes.js

Router.onBeforeAction(function () {
  if (!Meteor.user() || Meteor.loggingIn())
    this.redirect('welcome.view');
  else
    this.next();
  }
  ,{except: 'welcome.view'}
);

Router.onBeforeAction(function () {
  if (Meteor.user())
    this.redirect('home.view');
  else
    this.next();
  }
  ,{only: 'welcome.view'}
);

在同一个文件 both/routes.js 中,我有一个简单的服务器端路由,可以将 pdf 呈现到屏幕上,如果我删除 onBeforeAction 代码,该路由就可以工作(pdf 呈现到页):

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

服务器路由异常抛出

这不是重点,但是当我将上述服务器端路由添加到文件并采用路由 /pdf-server 时出现异常,同时保留 onBeforeAction 代码。

可以在此处找到对异常的见解:SO Question on Exception

我的问题

Question 4: I've seen a few places where middle ware is used for server side routes, for example:

WebApp.connectHandlers.stack.splice(...);

WebApp.connectHandlers.use(function(...) ...);

But none of these examples had security inside, will using middle ware in this way allow me to get around my problem?

注意:这个问题是发现的一个更大的 SO 问题的一个子集 here,但我想我应该把它分开,因为这个主题真的值得 IMO 自己提出问题。

@David Weldon 回答了问题的一部分,如何渲染服务端路由:Server side routes in Iron Router and Meteor. Middleware doesn't solve the other half, which is authentication. A SO question has been posted about that here: