Сообщение «Match.Error»: «Ошибка соответствия: Ожидается конкретный конструктор» - PullRequest
0 голосов
/ 10 мая 2018

Я новичок в Метеоре и Реактиве, и Я пытаюсь включить «поиск» в метеор и использую для этого пакет easysearch. Я получаю ошибку. Точные формулировки ошибки следующие:

match.js:40 Uncaught 
errorClass {message: "Match error: Expected particular constructor", path: "", sanitizedError: errorClass, errorType: "Match.Error", stack: "Error: Match error: Expected particular constructo…5a95662d577f9e8a17248e5683161da2f8b114da:3779:14)"}
errorType: "Match.Error"
message: "Match error: Expected particular constructor"
path: ""

Я действительно не могу понять, почему возникает эта ошибка и как ее решить. Я пишу свой код ниже, чтобы ошибка была точно найдена.

search.html (шаблон для поиска)

    <template name="search">
    <div id="search-wrap">
        <div>Search page!</div>
        <div class="black searchbar">
            {{> EasySearch.Input index=index attributes=inputAttributes }}
        </div>

        {{#EasySearch.IfInputEmpty index=index }}
            <div class="padded examples black">For example "Company 1"</div>
        {{else}}
            {{#if resultsCount}}
                <div class="padded count-results black">{{resultsCount}} results found.</div>
            {{/if}}
        {{/EasySearch.IfInputEmpty}}

        {{#EasySearch.IfSearching index=index }}
            <div>Searching</div>
        {{/EasySearch.IfSearching}}

        <ol class="leaderboard">
            {{#EasySearch.Each index=index }}
                {{> User}}
            {{/EasySearch.Each}}
        </ol>

        {{#EasySearch.IfNoResults index=index }}
            <div class="padded no-results black">No results found</div>
        {{else}}
        {{/EasySearch.IfNoResults}}

        {{> EasySearch.Pagination index=index maxPages=10 }}
        {{! > EasySearch.LoadMore index=index}}

        {{#if showMore}}
            {{> EasySearch.Input name="mini-index" index=index attributes=inputAttributes }}
            <ul>
                {{#EasySearch.Each name="mini-index" index=index}}
                    <li>{{name}}</li>
                {{/EasySearch.Each}}
            </ul>

        {{/if}}
        <!-- Easy Search -->
    </div>
    <!-- End search -->

 --></template>

<template name="User">
    <li class="user black {{selected}}" id="user-link">
         <span class="name">{{name}}</span>
      </li>
</template>

Файл index.js (Создание индекса по Коллекции - компании)

import Companies from "./companies.js";
import { EasySearch } from 'meteor/easy:search';
import { Meteor } from 'meteor/meteor';
import { Mongo } from "meteor/mongo";


export const CompaniesIndex = new EasySearch.Index({
    engine: new EasySearch.MongoDB({
        sort: function() {
            //return based on the latest additions, newest on top
            return { createdAt: -1 };
        },
        //something easy search always asks for
        selector: function(searchObject, options, aggregation) {
            let selector = this.defaultConfiguration().selector(searchObject, options, aggregation),
            //to sort with category.
            categoryFilter = options.search.props.categoryFilter;

            //search with a category, not really sure what it does, using the easysearch docs.
            if(_.isString(categoryFilter) && !_.isEmpty(categoryFilter)) {
                selector.category = categoryFilter;
            }

            return selector;
        }
    }),
    //collection name
    collection: Companies,
    //fieldname to be searched on
    fields: ['name'],
    defaultSearchOptions: {
        //limit the results size to be 10
        limit: 10
    },
    permission: () => {
        return true;
    }
});

// export const CompaniesIndex;

Файл jsx (Company-search-trial.jsx)

import React from "react";
import Blaze from "meteor/gadicc:blaze-react-component";
import "./pages/search.html";
import Companies from "../api/data/companies.js";
import CompaniesIndex from "../api/data/index.js";

/* A set of controls for the user to select search queries and options.
 * For use in the CompanySearchPage.
 */



Template.search.rendered = function() {
    $("#search-link").addClass('selected');
    $("#profile-link").removeClass('selected');
    $("#rankings-link").removeClass('selected');
    $("#jokes-link").removeClass('selected');
    $("#login-link").removeClass('selected');
}

Template.search.helpers({
    inputAttributes: function() {
        return { 'class': 'easy-search-input', 'placeholder': 'Start Searching' };
    },
    players: function() {
        return Companies.find({}, { sort: { createdAt: -1 } });
    },
    selectedName: function() {
        var company = CompaniesIndex.config.mongoCollection.findOne({ __originalId: Session.get("selectedCompany") });
        return company && company.Name;
    },
    index: function () {
        return CompaniesIndex;
    },
    resultsCount: function() {
        return CompaniesIndex.getComponentDict().get('count');
    },
    showMore: function() {
        return false;
    },

    renderTmpl: () => Template.renderTemplate

});

Template.User.helpers({
    selected: function() {
        return Session.equals("selectedCompany", this.__originalId) ? "selected" : '';
    },
});

Template.User.events({
    'click': function() {
        Session.set("selectedCompany", this.__originalId);
    }
});


export default class CompanySearchTrial extends React.Component {
    render() {
         return (
            <div className="page CompanySearchTrial">
                <Blaze template="search"/>
            </div>
        );
    }
}

Может кто-нибудь, пожалуйста, помогите мне с этим. Я действительно не знаю, как это сделать. Спасибо!

1 Ответ

0 голосов
/ 11 мая 2018

Ошибка: Match error: Expected particular constructor" указывает на вероятную причину неверного параметра для функции. Это также дает нам указание на то, что проблема заключается в отсутствии конструктора.

Две вещи в вашем коде, которые используют конструкторы (т.е. создаются с помощью new): EasySearch.Index и EasySearch.MongoDBEngine.

Если взглянуть на документацию для EasySearch , правильный способ импорта обоих этих классов выглядит следующим образом:

import { Index, MongoDBEngine } from 'meteor/easy:search'

// Client and Server
const index = new Index({
  ...
  engine: new MongoDBEngine({
    sort: () => { score: 1 },
  }),
});

Пройдите вышеописанное и посмотрите, решит ли это вашу проблему

...