一尘不染

使用服务器路由和onBeforeAction时发生异常

node.js

尝试添加pdf文件生成时,我看到奇怪的行为。

在if语句上,以下代码将引发:both \ routes.js

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

错误:只能在方法调用中调用Meteor.userId。在发布函数中使用this.userId。在[对象Object]
.Router处的Object.Meteor.user(packages / accounts-base /
accounts_server.js:24:1)处的Object.Meteor.userId(packages / accounts-base /
accounts_server.js:19:1)。包中的onBeforeAction.except(app / both / 3-router /
routes.js:10:15)/ [对象对象]
._。extend.withValue(程序包/iron:router/lib/router.js:277:1)(packages /在[object
Object] .hookWithOptions(packages / iron:router / lib /
router.js:276:1)处的流星/dynamics_nodejs.js:56:1)在boundNext(packages /
iron:middleware-stack / lib / middleware_stack.js)
:251:1)在runWithEnvironment(packages / meteor /
dynamics_nodejs.js:108:1)在package / meteor /
dynamics_nodejs.js:121:1在[object Object] .dispatch(packages /
iron:middleware-stack / lib / middleware_stack.js:275:1)

仅当我将此代码添加到文件中并且采用/ pdf路由时:

Router.route('/pdf', 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'
});

上面的代码工作正常;当我取出onBeforeAction代码时,pdf会呈现到屏幕上,并且不会引发任何异常。

相反,如果我删除服务器路由,则没有路由会导致异常。


阅读 244

收藏
2020-07-07

共1个答案

一尘不染

发生这种情况是因为您使用的路由是服务器端路由。Meteor用于验证用户身份的技术是通过Web套接字通过DDP协议完成的。

当您的浏览器向服务器发出GET/ POST请求时,它没有有关用户身份验证状态的任何信息。

Meteor.user()在中使用,Route.onBeforeAction但无法访问此信息。

解决方案是找到一种验证用户身份的替代方法。一种这样的方法是使用cookie。

这是Meteor身份验证系统的已知问题,请参阅:https : //github.com/EventedMind/iron-
router/issues/649

2020-07-07