尝试添加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会呈现到屏幕上,并且不会引发任何异常。
相反,如果我删除服务器路由,则没有路由会导致异常。
发生这种情况是因为您使用的路由是服务器端路由。Meteor用于验证用户身份的技术是通过Web套接字通过DDP协议完成的。
当您的浏览器向服务器发出GET/ POST请求时,它没有有关用户身份验证状态的任何信息。
GET
POST
您Meteor.user()在中使用,Route.onBeforeAction但无法访问此信息。
Meteor.user()
Route.onBeforeAction
解决方案是找到一种验证用户身份的替代方法。一种这样的方法是使用cookie。
这是Meteor身份验证系统的已知问题,请参阅:https : //github.com/EventedMind/iron- router/issues/649