Meteor 404错误“未找到方法'messages.insert'”

时间:2016-06-28 17:03:35

标签: javascript mongodb meteor reactjs

我一直在成功调用Meteor方法,直到我创建了一个新的Mongo集合。这两个集合都在/imports/collections/下找到,因此我知道它可供客户端和服务器使用。

这是Meteor.method,与我的工作系列几乎相同。:

import { Mongo } from 'meteor/mongo';

Meteor.methods({
    'messages.insert': function(data) {
        return Messages.insert({
            otherCollectionId: data.otherCollectionId,
            type: data.type,
            createdAt: new Date(),
            sender: this.userId,
            text: data.text
        });
    }
});

export const Messages = new Mongo.Collection('messages');

以下是我的称呼方式:

import React from 'react';
import { Messages } from '../../imports/collections/messages';
// other imports

export default class Chat extends React.Component {

// other code    

    handleComposeClick() {
        if (this.refs.text) {
            let data = {
                playlistId: this.props.playlist._id,
                type: 'user',
                text: this.refs.text.value
            };

            Meteor.call('messages.insert', data, (error, playlistId) => {
                if (!error) {
                    this.setState({error: ''});
                    this.refs.text.value = '';
                } else {
                    this.setState({ error });
                    console.log(error);
                }
            });
        }
    }

// render() 
}

每当我点击并触发handleComposeClick()时,我都会收到此错误:

errorClass {error: 404, reason: "Method 'messages.insert' not found", details: undefined, message: "Method 'messages.insert' not found [404]", errorType: "Meteor.Error"}

2 个答案:

答案 0 :(得分:1)

请注意/imports文件夹中的任何内容都,除非它实际导入,否则使用以下语法:

import somethingINeed from '/imports/wherever/stuff';
import { somethingElseINeed } from '/imports/wherever/things';

或:

import '/imports/server/stuff';

因此,对于方法,您可能希望设置具有以下内容的结构:

/lib/main.js

import '../imports/startup/lib';

/imports/startup/lib/index.js

import './methods';
// any other shared code you need to import

/imports/startup/lib/methods.js

import { Meteor } from 'meteor/meteor';
import { Messages } from '/imports/collections/messages'; // don't define your collections in a methods file

Meteor.methods({
    'messages.insert': function(data) {
        return Messages.insert({
            otherCollectionId: data.otherCollectionId,
            type: data.type,
            createdAt: new Date(),
            sender: this.userId,
            text: data.text
        });
    }
});

虽然如果我是你,我会使用validated methods,您实际导入要使用的方法以便使用它,例如:

import { messagesInsert } from '/imports/common-methods/message-methods';

// code...
messagesInsert.call({ arg1, arg2 }, (error, result) => { /*...*/ });

使用此结构,您将导入/server/main.js导入../imports/startup/server,导入./methods,(在我的特定项目中)如下所示:

// All methods have to be imported here, so they exist on the server
import '../../common-methods/attachment-methods';
import '../../common-methods/comment-methods';
import '../../common-methods/tag-methods';
import '../../common-methods/notification-methods';
import '../../features/Admin/methods/index';
import '../../features/Insights/methods';
import '../../features/Messages/methods';

请记住,这并不是实际执行这些方法,它只是确保它们在服务器上定义,以便在客户端导入这些经过验证的方法并运行它们时,它不会#39; t炸弹说这个方法无法在服务器端找到。

答案 1 :(得分:0)

向@MasterAM致敬,帮助我找到我的拼写错误。结果我在200

中的路径不正确