Серверные маршруты в 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(...) ...);
Но ни в одном из этих примеров не было безопасности внутри, позволит ли использование промежуточного программного обеспечения таким образом обойти мою проблему?