为什么我的查询无法识别我的有效变量?



救命!我的应用程序中发生了一些非常奇怪的事情。

我有一个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("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

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

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

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

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

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

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

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

最新更新