简体   繁体   English

后续:Meteor.users与字符串参数

[英]Followup: Meteor.users with string argument

I have a template iterating through user _id strings. 我有一个遍历用户_id字符串的模板。

    <div class="page-header"><h4>Colleagues</h4></div>
        <ul class="list-group">
            {{#each colleague}}
                <li class="list-group-item">
                    <div class="colleague">
                    {{nameOrEmail}}
                    </div>
                </li>
            {{/each}}
        </ul>

When I call 当我打电话

nameOrEmail: function () {
    if (myTeam.ready()) {
        console.log ("into function nameorEmail");
        console.log(this);
        var self=this;
        if (self) { 
        var colleague=Meteor.users.findOne({_id:self});
        console.log(colleague);
        if (colleague.username)
            return colleague.username;
        else if (colleague.emails.count()>0)
            return collegue.emails[0].address;
        }}
    return null;

within the template, it tosses an error when executing the var colleague=Meteor.users.findOne({_id:self}). 在模板中,执行var colleague = Meteor.users.findOne({_ id:self})时会抛出错误。 Specifically, it throw a type error that Object 0 has no method 'substr' 具体来说,它引发类型错误,即对象0没有方法'substr'

manageAccount.js?a86dcce62b84091cf50c653de6d2db7f0102a155:59
Exception from Deps recompute function: TypeError: Object 0 has no method 'substr'
at http://localhost:3000/packages    /minimongo.js?4ee0ab879b747ffce53b84d2eb80d456d2dcca6d:1211:33
at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?0a80a8623e1b40b5df5a05582f288ddd586eaa18:159:22)
at isOperatorObject (http://localhost:3000/packages/minimongo.js?4ee0ab879b747ffce53b84d2eb80d456d2dcca6d:1210:5)
at compileValueSelector (http://localhost:3000/packages/minimongo.js?4ee0ab879b747ffce53b84d2eb80d456d2dcca6d:1406:14)
at http://localhost:3000/packages/minimongo.js?4ee0ab879b747ffce53b84d2eb80d456d2dcca6d:1386:9
at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?0a80a8623e1b40b5df5a05582f288ddd586eaa18:164:22)
at compileDocumentSelector (http://localhost:3000/packages/minimongo.js?4ee0ab879b747ffce53b84d2eb80d456d2dcca6d:1369:5)
at _.extend._compileSelector (http://localhost:3000/packages/minimongo.js?4ee0ab879b747ffce53b84d2eb80d456d2dcca6d:1346:12)
at new Minimongo.Matcher (http://localhost:3000/packages/minimongo.js?4ee0ab879b747ffce53b84d2eb80d456d2dcca6d:1289:27)
at new LocalCollection.Cursor (http://localhost:3000/packages/minimongo.js?4ee0ab879b747ffce53b84d2eb80d456d2dcca6d:142:20) 

I have confirmed that I can run the findOne command from the Javascript console and get the expected result. 我已经确认可以从Javascript控制台运行findOne命令并获得预期的结果。 I have also traced the execution of the program through the meteor functions. 我还通过流星函数跟踪了程序的执行。 It appears to me that the function _.type in the selector.js file may be the culprit. 在我看来,selector.js文件中的_.type函数可能是罪魁祸首。

LocalCollection._f = {
// XXX for _all and _in, consider building 'inquery' at compile time..

_type: function (v) {
if (typeof v === "number")
  return 1;
if (typeof v === "string")
  return 2;
if (typeof v === "boolean")
  return 8;
if (isArray(v))
  return 4;
if (v === null)
  return 10;
if (v instanceof RegExp)
  // note that typeof(/x/) === "object"
  return 11;
if (typeof v === "function")
  return 13;
if (v instanceof Date)
  return 9;
if (EJSON.isBinary(v))
  return 5;
if (v instanceof LocalCollection._ObjectID)
  return 7;
return 3; // object

When I trace this through with v as a string (confirmed in the Javascript debugger local variable monitor): 当我使用v作为字符串进行跟踪时(在Javascript调试器局部变量监视器中确认):

String {0: "d", 1: "e", 2: "P", 3: "k", 4: "j", 5: "N", 6: "j", 7: "4", 8: "8", 9: "T", 10: "e", 11: "F", 12: "v", 13: "d", 14: "z", 15: "v", 16: "K", length: 17} 

It returns a value of 3 (object) rather than 2 (string). 它返回值3(对象)而不是2(字符串)。

I suspect this is the root cause of my problem. 我怀疑这是我问题的根本原因。 Is this a bug in meteor? 这是流星中的虫子吗? Does anyone know how to work around this issue? 有谁知道如何解决此问题?

Thanks in advance for any help. 在此先感谢您的帮助。

OK, I explicitly cast the string to type string and now it works. 好的,我显式地将字符串转换为字符串类型,现在可以正常工作了。 Very strange. 很奇怪。

        if (self) { 
        var colleague=Meteor.users.findOne({_id:String(self)});
        console.log(colleague);
        if (colleague.username)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM