我实现了一个钩子函数,我将一些createdAt
和updatedAt
字段附加到插入到集合中的doc
。我可以将它附加到这样的任何集合:
export const insertHook = function (doc) {
try {
const user = Meteor.user();
doc.createdBy = user && user._id ? user._id : null;
doc.createdAt = new Date().getTime();
} catch (e) {
console.err(e);
}
};
将钩子附加到集合基本上是通过构造函数中的第三个选项传递它:
class HookedCollection extends Mongo.Collection {
constructor(name, options, hooks={}) {
super(name, options);
this.insertHook = hooks.insertHook;
}
insert(doc, callback) {
if (this.insertHook && Meteor.isServer)
this.insertHook.call(this, doc);
}
}
export const MyDocs = new HookedCollection("mydocs", {}, {insertHook});
在Meteor方法中,我只是做一个正常的插入:
Meteor.methods({
insertDoc:function(doc) {
//check doc...
return MyDocs.insert(doc);
}
});
这基本上会产生以下错误:
Error: Meteor.userId can only be invoked in method calls or publications.
我尝试了bind
的几种方法,但总是在这个错误中结束。是否真的没有办法将userId绑定到函数?
答案 0 :(得分:1)
根据Meteor docs Meteor.userId()
可以在任何地方使用,但发布功能(服务器端发布功能)。
您不是直接在方法中使用Meteor.userId()
,而是在回调中使用userId
(请参阅讨论in this github issue)。您可以将// Using Meteor.userId()
Meteor.methods({
insertDoc:function(doc) {
//check doc...
return MyDocs.insert(doc, Meteor.userId());
}
});
// Or using this.userId
Meteor.methods({
insertDoc:function(doc) {
//check doc...
return MyDocs.insert(doc, this.userId());
}
});
信息作为方法中的参数传递给回调函数,例如:
Meteor.userId()
作为一般规则,在客户端(查询数据库)和服务器中的this.userId
中使用STYLE | INVOICE_DATE2
A | 2017-01-03
B | 2017-01-03
C | 2017-01-03
A | 2017-02-03
A | 2017-01-03
B | 2017-02-03
B | 2017-01-03
。有关此问题的更多信息Meteor - Why should I use this.userId over Meteor.userId() whenever possible?和Meteor forums