当前位置: 首页 > 面试题库 >

Iron Router和Meteor中的服务器端路由

微生弘
2023-03-14
问题内容

前锋

看来,在Meteor中,如果没有正常工作流程(根据我对服务器端路由的了解)进行某种变通,我们就无法调用服务器端路由将文件呈现到页面。我希望我对此是错误的,并且有一种简单的方法可以实现我想要做的事情…

很抱歉,如果这有点长,但是我认为在这种情况下,有必要提供更多的背景和背景信息

软件/版本

我使用的是最新的Iron Router 1. 和Meteor 1. ,首先,我使用的是Accounts-password。

背景/背景

我有一个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'}
);

在同一个文件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问题中答案的主要依据是"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'"

因此,总而言之,为了允许服务器端路由,建议我使用cookie而不是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:以SO Cookies技术中描述的方式设置/获取Cookie
似乎不适用于我,该技术在‘15仍然有效吗?

问题2:使用cookie,如何基于这些cookie通知服务器身份验证状态?或者,以另一种方式,如何在我的服务器端路由中添加cookie检查以“通知”服务器有关用户的信息?我真的可以检查这条路线中的任何东西;我可以拒绝任何用户,但是服务器需要以某种方式“知道”已登录的用户,对吗?

问题3:Cookie是解决此问题的最佳方法,还是有一种更简单的方法来实现相同目的?

附带问题:我已经看到一些中间件用于服务器端路由的地方,例如:

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

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

但是这些示例都没有内部安全性,以这种方式使用中间件是否可以解决我的问题?


问题答案:

您的服务器端路由正在运行全局onBeforeAction代码(在共享目录中定义),该代码会中断,因为服务器路由是不了解用户身份验证信息(即Meteor.user()不起作用)的简单REST端点。解决方案是使用来包装特定于客户端的onBeforeAction调用,Meteor.isClient或者只是将该代码移动到client目录下。例如:

if (Meteor.isClient) {
  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'}
  );
}

Router.route('/pdf-server', function() {
  ...
}, {where: 'server'});


 类似资料:
  • 问题内容: 我一直在思考,我对客户端和服务器之间的路由感到困惑。假设我在将请求发送回Web浏览器之前使用ReactJS进行服务器端渲染,并使用react- router作为客户端路由在页面之间切换而不刷新为SPA。 我想到的是: 路线如何解释?例如,从首页()到帖子页面()的请求 路由在服务器端还是客户端去哪里? 它如何知道如何处理? 问题答案: 注意,此答案涵盖了React Router版本0.

  • 我想到的是: 路线是如何解释的?例如,从主页()到帖子页()的请求 路由在服务器端还是客户端? 它如何知道它是如何处理的?

  • 我已经使用Vue CLI创建了一个Vue3应用程序,用Vuex和路由器创建我的应用程序。应用程序运行良好。 注意:我遵循了这个有用的文档,用于Vue3的Vuexhttps://blog.logrocket.com/using-vuex-4-with-vue-3/ 要求现在我想更改我的Vue3应用程序,使其具有服务器端渲染支持(即SSR)。 我观看了关于使用Vue3创建SSR应用程序的精彩视频:ht

  • 我一直在搜索net,试图找到任何定义如何在流星和响应路由器4中处理身份验证的地方。 基本上,我希望某些路由只对经过身份验证的用户可用。有相关文件吗? 阿西尔

  • 问题内容: 为服务器端路由验证用户的最佳方法(最安全,最简单)是什么? 软件/版本 我使用的是最新的Iron Router 1. 和Meteor 1. ,首先,我使用的是Accounts-password。 参考代码 我有一个简单的服务器端路由,可将pdf呈现到屏幕上: 两者/routes.js 举例来说,我想做些类似于该SO答案建议的操作: 在服务器上: 然后在客户端代码中: 但是,即使我以某种

  • 我是GWT的新手,我有一个在GWT上开发的应用程序。我需要在服务器端集成一个用python开发的程序。用python开发的应用程序必须取一个MalLab文件,然后按格式生成一些文件。PNG。目前,我对python程序进行了更改,因为它必须将文件放在特定的网址上。你是如何在服务器端将GWT应用程序与python集成的?。 python中的程序是: