2

各位早安!尝试在 Meteor 中进行简单的插入时遇到了一些麻烦,但是通过 anobject正在杀死我。

我的网站上有一组正在工作的过滤器,但现在我想将selector这些过滤器中的一个保存到一个集合中,以便我可以快速提取与多个过滤器匹配的文档。

问题似乎是传递一个包含已保存搜索的对象。该对象确实具有 Collection2 可能看到的嵌套属性(“addresses.state”),但我在架构上设置了“blackbox:true”,所以我不知道为什么它甚至会在那里寻找......

这是整个流程:

表格保存搜索名称:

<template name="saveSearch">
  <div>
    <button class="btn btn-link" type="button" data-toggle="collapse" data-target="#saveSearchForm" aria-expanded="false" aria-controls="saveSearchForm">
      Advanced Search
    </button>
    <div class="collapse" id="saveSearchForm">
      <div class="well">
        // Display filters from the awesome meteor-tabular-filter package
        {{> expression_filter}}
        <form id="saveSearch" class="form-inline">
          <div class="form-group">
            <label for="searchName">Save Search</label>
            <input type="text" class="form-control" name="searchName" id="searchName" placeholder="Search Name">
          </div>
          <button type="submit" class="btn btn-primary">Save Search</button>
        </form>
      </div>
    </div>
  </div>
</template>

调用方法插入搜索的模板事件:

Template.saveSearch.events({
  'submit #saveSearch' ( event, template ) {
    event.preventDefault();

    let queries = Session.get("filter_selector"),
        search = {
          name: String(template.find( "[name='searchName']" ).value),
          selector: queries
        };

    console.log('search: ' + JSON.stringify(search));

    Meteor.call( 'insertSearch', search, ( error, response ) => {
      if ( error ) {
        Bert.alert( error.reason, 'warning', 'growl-top-right' );
      } else {
        Bert.alert( 'Search saved', 'success', 'growl-top-right' );
      }
    });
  }
});

这是几个不同的 console.log(); 传递给方法的结果:

1) {"name":"Alabama","selector":{"addresses.state":"AL"}}
2) {"name":"Alabama","selector":{"$and":[{"addresses.state":"AL"},{"lastName":"Knapp"}]}}

Meteor方法插入搜索

// in both/methods/insert
Meteor.methods({
  insertSearch( doc ) {
    check( doc, Searches.simpleSchema() );

    var defaultProperties = {
      orgId    : Meteor.user().profile.currentOrg,
      createdBy: Meteor.userId(),
      createdAt: moment().toDate()
    };

    newDoc = _.extend(doc, defaultProperties);

    console.log('search to insert: ' + JSON.stringify(newDoc));

    try {
      var searchId = Searches.insert( newDoc, {bypassCollection2: true} );
      console.log('search insert successful');
      return searchId;
    } catch( exception ) {
      console.log('search insert failed');
      throw new Meteor.Error(500, 'Search failed to save.');
    }
  }
});

这是几个不同的 console.log(); 传递给插入的结果:

1) {"name":"Alabama","selector":{"addresses.state":"AL"},"orgId":"testorg","createdBy":"DHo3vr3fiZbSYBJks","createdAt":"2016-01-28T13:38:27.499Z"}
2) {"name":"Alabama","selector":{"$and":[{"addresses.state":"AL"},{"lastName":"Knapp"}]},"orgId":"testorg","createdBy":"DHo3vr3fiZbSYBJks","createdAt":"2016-01-28T13:42:51.468Z"}

以及 Searches 集合的架构定义......

Searches = new Mongo.Collection( 'searches' );

Searches.allow({
  insert: () => false,
  update: () => false,
  remove: () => false
});

Searches.deny({
  insert: () => true,
  update: () => true,
  remove: () => true
});

let searchSchema = new SimpleSchema({
  name: {
    label: 'Search Name',
    type: String
  },
  selector: {
    label: 'Search Criteria',
    type: Object,
    blackbox: true,
    optional: true
  },
  orgId: {
    type: String,
    optional: true
  },
  createdBy: {
    type: String,
    label: "Created By",
    optional: true,
    autoValue: function() {
      return Meteor.userId()
    }
  },
  createdAt: {
    type: Date,
    label: "Created At",
    optional: true,
    autoValue: function () {
      if (this.isInsert) {
        return new Date;
      }
    },
    denyUpdate: true
  },
  updatedAt: {
    type: Date,
    label: "Updated At",
    optional: true,
    autoValue: function () {
      if (this.isInsert) {
        this.unset();
      } else {
        return new Date;
      }
    }
  }
});

Searches.attachSchema( searchSchema );

最后,这是来自 Kadira 的错误日志:

message: Search failed to save. [500] 
stack:
Error: Search failed to save. [500]
    at [object Object].Meteor.methods.insertSearch (both/methods/insert/searches.js:21:13)
    at [object Object].methodMap.(anonymous function) (packages/meteorhacks_kadira/lib/hijack/wrap_session.js:164:1)
    at maybeAuditArgumentChecks (livedata_server.js:1698:12)
    at livedata_server.js:708:19
    at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1)
    at livedata_server.js:706:40
    at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1)
    at livedata_server.js:704:46
    at tryCallTwo (/Users/allen/.meteor/packages/promise/.0.5.1.1u69k2a++os+web.browser+web.cordova/npm/node_modules/meteor-promise/node_modules/promise/lib/core.js:45:5)
    at doResolve (/Users/allen/.meteor/packages/promise/.0.5.1.1u69k2a++os+web.browser+web.cordova/npm/node_modules/meteor-promise/node_modules/promise/lib/core.js:171:13)

在此先感谢您的帮助!

4

0 回答 0