【问题标题】:Why doesn't my query NOT recognize my valid variable?为什么我的查询不能识别我的有效变量?
【发布时间】:2017-10-11 15:17:04
【问题描述】:

帮助!我的应用中发生了一些非常奇怪的事情。

我有一个 merchantReview 模板,应该显示审阅者的数量。
下面是模板的样子:

<template name="merchantReview">
<div> {{numberOfReviewers}}&nbsp;Total</div>

以及辅助代码是什么样子的:

Template.merchantReview.helpers({

 'numberOfReviewers': function () { 

  var numberOfReviewers = 0;
  var merchantProfileId = Session.get('offerUserId2');
  console.log("The numberOfReviews _id session is: " + merchantProfileId );

    merchantReviews.find({_id: merchantProfileId}).map(function (doc)
      {
        numberOfReviewers += doc.noOfReviewers;
      });

    return numberOfReviewers;
    }
});

这在merchantReview 页面上完全没有任何结果。

让我们看看路由器:

Router.route('/merchantReview/:_id', {
template: 'merchantReview',
data: function(){
    },

waitOn: function(){

  return Meteor.subscribe('merchantReviews');
  }  
});

以及订阅的内容:

Meteor.publish('merchantReviews', function publishmerchantReviews(){
return merchantReviews.find();
});

现在是“非常奇怪的事情”部分。 当我在 chrome 浏览器控制台中运行以下代码(类似于帮助程序代码)时,我得到了不同的结果。

当我运行以下内容时:

  var numberOfReviewers = 0;
  var merchantProfileId = Session.get('offerUserId2');
  console.log("The _id is: " + merchantProfileId );

merchantReviews.find({_id: merchantProfileId}).map(function (doc)
  {
    numberOfReviewers += doc.noOfReviewers;
  });

console.log (numberOfReviewers);

...它产生:

The _id is: udEnfEmy5DSBvDsSy
0

如您所见,它绕过了merchantReviews.find 查询。

但是,稍微修改一下代码,然后运行:

  var numberOfReviewers = 0;
  var merchantProfileId = Session.get('offerUserId2');
  console.log("The _id is: " + merchantProfileId );

merchantReviews.find({_id: "udEnfEmy5DSBvDsSy"}).map(function (doc)
  {
    numberOfReviewers += doc.noOfReviewers;
  });

console.log (numberOfReviewers);

这次它产生了:

The _id is: udEnfEmy5DSBvDsSy
93

是不是很奇怪?

谁能解释为什么 merchantReviews.find({_id: merchantProfileId})... 查询不能识别包含udEnfEmy5DSBvDsSy 值的merchantProfileId 变量?我该如何解决这个问题?

【问题讨论】:

  • 可以加console.log('"' + merchantProfileId + '"')吗?最后可能有多余的空间。
  • @user3374348 我听从了您的建议,结果是:“udEnfEmy5DSBvDsSy”确认任何一端都没有多余的空间。
  • 你在哪里设置Session var?
  • 您的实验并不表示绕过查询,它只是表示结果为0。还有其他原因可能导致这种情况。当您运行代码的第一个版本时,是否可能发布尚未准备好?如果您想更有效地调试事物,则需要更好地隔离事物。例如,将数据记录在尽可能靠近根的位置(查询结果而不是基于它完成的计算将更好地指示查询是如何执行的)。
  • 如果没有弹出警报,很可能是您的 MerchantProfileId 在某处包含隐藏空格。请做两件事:第一件事console.log(merchantProfileId.length, String("udEnfEmy5DSBvDsSy").length),第二件事如果你这样做merchantProfileId = merchantProfileId.replace(/\s+/g)会发生什么?

标签: meteor mongodb-query minimongo


【解决方案1】:

变量在查询中没有被识别的原因是因为变量是array形式而不是string形式。

我通过console.log("The _id is: " + merchantProfileId );意识到这一点

这有时会产生:

["udEnfEmy5DSBvDsSy"]

我通过使用toString() 函数清理变量以确保它是字符串而不是数组来解决他的问题。所以在代码中:merchantProfileId.toString();

以下是代码中的完整分辨率:

var numberOfReviewers = 0;
var merchantProfileId = Session.get('offerUserId2');

// Below immediately sanitize the variable ensuring it is a string
// before its used in the query.
merchantProfileId = merchantProfileId.toString();

console.log("The _id is: " + merchantProfileId );

merchantReviews.find({_id: merchantProfileId}).map(function (doc)
{
  numberOfReviewers += doc.noOfReviewers;
});

console.log (numberOfReviewers);

这会产生:

The _id is: udEnfEmy5DSBvDsSy
104

【讨论】:

    【解决方案2】:

    您只需在光标上使用.count() 即可简化和加速您的助手。如果,正如您在 cmets 中提到的,您的 offerUserId2 会话变量返回一个数组,那么您可以使用 [0] 引用它的第一个元素:

    Template.merchantReview.helpers({
     numberOfReviewers() { 
       return merchantReviews.find(Session.get('offerUserId2')[0]).count();
     }
    })
    

    【讨论】:

    • 很棒的编码建议,尽管当我在 chrome 浏览器控制台中运行它时并没有什么不同。当它应该产生 1 时,查询仍然产生“0”。这个问题的奇怪之处在于,为了获得所需/正确的查询结果,当我运行类似于以下的代码时,我必须插入实际的 _id number 而不是变量这个:Template.merchantReview.helpers({ numberOfReviewers() { return merchantReviews.find(_id: "udEnfEmy5DSBvDsSy").count(); } })
    • 那么Session.get('offerUserId2') 不包含您认为它包含的内容。试试if (Session.get('offerUserId2') === "udEnfEmy5DSBvDsSy") console.log("offerUserId2 is what I expect!")
    • 你说的很对。我添加了if (Session.get('offerUserId2') === "udEnfEmy5DSBvDsSy"),但失败了。事实证明,Session.get('offerUserId2') 实际上是数组形式。我确实设法通过使用 toString() 函数清理变量来解决问题。
    【解决方案3】:

    您的问题是一个经典的 javascript 异步问题。查看您的代码,

    merchantReviews.find({_id: "udEnfEmy5DSBvDsSy"}).map(function (doc)
      {
        numberOfReviewers += doc.noOfReviewers;
      });
    
    console.log (numberOfReviewers);
    

    添加到 numberOfReviewers 发生在 MercerReviews.find() 的回调中 - 这通常发生在稍后的某个时间。您的 console.log 可能在此之前发生,这就解释了为什么您会得到奇怪的结果。如果您将代码更改为此,您将获得一致的结果。

    merchantReviews.find({_id: "udEnfEmy5DSBvDsSy"}).map(function (doc)
      {
        numberOfReviewers += doc.noOfReviewers;
        console.log (numberOfReviewers);
      });
    

    这样想,在 javascript 中时间向右移动,而不是向下移动。因此,作为回调一部分的缩进代码(并且向右缩进)发生在底部的代码之后。

    【讨论】:

    • .find(...).map(...) 在 Meteor 中是同步的。
    • @Mikkel 也许我不够清楚,但这里的问题和我的问题的奇怪之处在于,当我使用变量 merchantProfileId 而不是实际值本身运行查询时:"udEnfEmy5DSBvDsSy" 例如:merchantReviews.find({_id: merchantProfileId}).map(function (doc) { numberOfReviewers += doc.noOfReviewers; console.log (numberOfReviewers); }); 我得到了一个不需要/错误的结果,但是当我用实际变量值替换变量时,例如:
    • @Mikkel ...merchantReviews.find({_id: "udEnfEmy5DSBvDsSy"}).map(function (doc) { numberOfReviewers += doc.noOfReviewers; console.log (numberOfReviewers); }); 我得到了正确的结果。我需要了解为什么查询不能识别我的变量值。为什么会这样?我确实听从了您的建议,当然使用变量而不是实际值本身,但遗憾的是得到了相同的不良/错误查询结果。 :-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多