“Match.Error”消息:“匹配错误:预期的特定构造函数”

时间:2018-05-09 23:28:14

标签: reactjs meteor full-text-search meteor-blaze meteor-easy-search

我是Meteor和React Framework的新手,并且 我试图在流星中加入'搜索',然后使用包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文件(在Collection上创建索引 - 公司)

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 :(得分:0)

错误:Match error: Expected particular constructor"指向函数无效参数的可能原因。它还为我们提供了指针,指出它是一个缺少构造函数的问题。

代码中使用构造函数的两件事(即使用new实例化)是EasySearch.IndexEasySearch.MongoDBEngine

快速查看documentation for EasySearch,导入这两个类的正确方法是这样的:

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

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

给出上述内容,看看它是否解决了您的问题