使用服务器路由和之前操作时出现异常
Exception when using a server route and onBeforeAction
我在尝试添加pdf文件生成时看到奇怪的行为。
在 if 语句上,以下代码引发:两者''路由.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 in publish functions.at Object.Meteor.userId (packages/accounts-base/accounts_server.js:19:1) at Object.Meteor.user (packages/accounts-base/accounts_server.js:24:1) at [object 对象]。Router.onBeforeAction.except (应用程序/两者/3 路由器/路由.js:10:15) 在 packages/iron:router/lib/router.js:277:1 at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1) at [object Object].hookWithOptions (packages/iron:router/lib/router.js:276:1) at boundNext (packages/iron:middleware-stack/lib/middleware_stack.js:251:1) at runWithEnvironment (packages/meteor/dynamics_nodejs.js:108:1) at packages/meteor/dynamics_nodejs.js:121:1 at [object Object].dispatch (包/熨斗:中间件堆栈/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'
});
上面的代码工作正常;pdf被渲染到屏幕上,当我取出onBeforeAction代码时,没有抛出异常。
反之亦然,如果我取出服务器路由,则没有导致异常的路由。
发生这种情况是因为您使用的路由是服务器端路由。Meteor用于验证用户身份的技术是通过DDP协议通过websockets完成的。
当您的浏览器向服务器发出GET
/POST
请求时,它没有任何关于用户身份验证状态的信息。
您在Route.onBeforeAction
中使用Meteor.user()
,但它无法访问此信息。
对此的解决方案是找到一种对用户进行身份验证的替代方法。其中一种方法是使用cookie的。
这是 Meteor 身份验证系统的已知问题,请参阅:https://github.com/EventedMind/iron-router/issues/649
比 cookie 更好的方法是存储 userId 和一些 sessionId 的 Meteor 命名集合:
您可以在调用服务器之前将当前 userId 存储在客户端:
var sessionId = Random.id();
col = new Mongo.Collection('session');
col.insert({
sessionId: sid,
userId: Meteor.userId(),
issued: new Date()
});
然后通过GET/POST
请求将sessionId
传递给服务器,并在服务器上读取:
var sid = this.request.query.sid;
var user = col.findOne({sessionId: sid}); // returns an object
使用单独的参数比使用userId
本身更好,因为您可以在一段时间后或服务器调用后立即撤销此sessionId
。
需要适当的allow/deny
权限才能防止任何人更新集合。另外,请注意,您不能信任客户方面的new Date()
。
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- Jquery菜单操作不稳定,定位不正确,存在一般错误
- 如何确定javascript已经完成了某些操作.ios上的
- 防止Alt+Shift默认操作或检测多种操作系统语言的Javascript
- 从JavaScript访问struts操作中的属性
- fluxxor向一个flux实例添加一组以上的操作
- Jquery表单验证插件-如果选中复选框,如何在提交时执行某些操作
- 操作放置在画布上的元素之间的连接
- 使用“+="操作人员
- Rails操作只调用一次,但我在ajax中每秒钟都调用一次
- Jquery未定义函数正在停止其他操作
- 如何操作iframe之外的元素
- javascript对象操作:根据指定条件选择属性
- jQuery:暂停按钮可以暂停所有其他操作
- 用于选择/文本框操作的JavaScript
- 显示引导弹出操作异常的逻辑
- 悬停菜单操作异常
- 使用服务器路由和之前操作时出现异常
- 当从ZeroMQ回调调用时,Meteor插入/删除操作引发异常
- AOP对DB异常执行一个通用的操作