Серверные маршруты в Iron Router и Meteor

Вперед

Похоже, что в Meteor, мы не можем вызвать серверный маршрут для рендеринга файла на страницу без какого-либо обходного пути из нашего обычного рабочего процесса, из того, что я читал о серверных маршрутах. Я надеюсь, что ошибаюсь по этому поводу, и есть простой способ добиться того, что я хочу сделать ...

** Извините, если это немного долго, но я думаю, что в этом случае предоставление дополнительной информации и контекста оправдано **

Программное обеспечение / Версии

Я использую последнюю версию Iron Router 1. * и Meteor 1. *, и для начала я просто использую аккаунт-пароль.

Предпосылки / контекст

У меня есть onBeforeAction, который просто перенаправляет пользователя на страницу приветствия или домашнюю страницу, если пользователь вошел в систему или нет:

оба / 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'}
);

В том же файле, как /ways.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-сервер, сохраняя при этом код onBeforeAction.

Понимание этого исключения можно найти здесь:ТАК вопрос об исключении

Решение для исключения

Основная суть ответа в SO Вопрос выше"You use Meteor.user() in your Route.onBeforeAction but it has no access to this information", и когда,"your browser make a GET/POST request" [Серверный маршрут?],"to the server it doesn't have any information regarding the user's authentication state."

Решение, согласно тому же SO, отвечает"find an alternative way to authenticate the user," и один из способов сделать это - использовать"cookies'".

Итак, в продолжение этого я нашел еще один SO-ответ (от того же автора, что и раньше), где описан метод установки и получения файлов cookie:Техника SO Cookies

** Итак, для подведения итогов, чтобы учесть маршруты на стороне сервера, предлагается использовать куки вместо чего-то вроде Meteor.userId () или this.userId. **

Добавлен код, связанный с cookie

Поэтому я добавил следующий код в свой проект: client / main.js

Deps.autorun(function() {
    if(Accounts.loginServicesConfigured() && Meteor.userId()) {
        setCookie("meteor_userid",Meteor.userId(),30);
        setCookie("meteor_logintoken",localStorage.getItem("Meteor.loginToken"),30);
    }
}); 

В моем маршруте на стороне сервера я изменил маршрут на это:

оба / routes.js

Router.route('/pdf-server', function() {
  //Parse cookies using get_cookies function from : https://stackoverflow.com/questions/3393854/get-and-set-a-single-cookie-with-node-js-http-server
  var userId = get_cookies(req)['meteor_usserid'];
  var loginToken = get_cookies(req)['meteor_logintoken'];
  var user = Meteor.users.findOne({_id:userId, "services.resume.loginTokens.token":loginToken});
  var loggedInUser = (user)?user.username : "Not logged in";

  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'});

Но это не работает должным образом, код setCookie по какой-то причине недопустим.

Мои вопросы

Вопрос 1: Установка / получение файлов cookie в порядке, указанном вТехника SO Cookies кажется, не работает для меня, эта техника все еще работает в 15 году?

Вопрос 2: Как использовать куки, как мне сообщить серверу о состоянии аутентификации на основе этих куки? Или, как иначе, как добавление проверки cookie в моем маршруте на стороне сервера «информирует» сервер о пользователе? Я мог бы проверить на этом пути что угодно; Я мог отклонить любого пользователя, но каким-то образом сервер должен «знать» о пользователе, вошедшем в систему, верно?

Вопрос 3: Являются ли файлы cookie лучшим способом для достижения этой цели, или существует более простой способ добиться того же?

Дополнительный вопрос: я видел несколько мест, где промежуточное программное обеспечение используется для маршрутов на стороне сервера, например:

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

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

Но ни в одном из этих примеров не было безопасности внутри, позволит ли использование промежуточного программного обеспечения таким образом обойти мою проблему?

Ответы на вопрос(1)

Ваш ответ на вопрос