>

도움말! 내 앱에서 매우 이상한 일이 일어나고 있습니다.

와이즈 비즈가있다  리뷰어 수를 표시해야하는 템플릿.
아래는 템플릿 모양입니다 :

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();
});

... 수익률 :

 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})... 를 인식하지 못합니다   merchantProfileId 를 보유하는 변수  값? 이 문제를 어떻게 해결합니까?

udEnfEmy5DSBvDsSy

  • 답변 # 1

    변수가 쿼리에서 인식되지 않는 이유는 변수가문자열형식 대신배열형식이기 때문입니다.

    나는 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 ()를 사용하여 도우미를 단순화하고 속도를 높일 수 있습니다. 의견에서 언급했듯이 귀하의 offerUserId2  세션 변수는 배열을 반환하고 [0] 를 사용하여 첫 번째 요소를 참조 할 수 있습니다 :

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

  • 답변 # 3

    문제는 고전적인 자바 스크립트 비동기 문제입니다. 코드를 보면

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

    numberOfReviewers에 추가는 merchantReviews.find ()의 콜백에서 발생합니다. 일반적으로 나중에 발생합니다. console.log가 그 전에 발생했을 가능성이 높은 이유를 설명합니다. 코드를 이것으로 변경하면 일관된 결과를 얻을 수 있습니다.

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

    이 방법을 생각하면 자바 스크립트 시간에는 페이지가 아닌 오른쪽으로 이동합니다. 따라서 콜백의 일부인 들여 쓰기 된 코드 (오른쪽으로 들여 쓰기)는 맨 아래의 코드 다음에 발생합니다.

관련 자료

  • 이전 JSON 데이터 유형 및 Java 모델 사용없이 편안한 서비스를위한 스와 거 주석
  • 다음 kestrel http server - ASPNET Core Programcs에서 비밀에 액세스하는 방법