Сохраните записи в той же коллекции в БД Mongo, используя Meteor js

Будучи новичком в Meteor JS, я не понимаю, как обновить запись. У меня есть 2 шаблона AddSchoolLayout и Schoolcontactlayout, AddSchoollayout создает запись в Mongo db, теперь для той же школы я хочу добавить ее адрес все еще в той же базе данных NewSchoolDB, но, пока я пробовал это, я продолжаю получать ошибку ниже о неправильном идентификаторе. Что я не прав?

Обратите внимание, что мой язык может не совпадать с языком Монго; Я все еще свеж, исходя из фона SQL.

Это method.js, где запись была сохранена.

//methods.js
    if (Meteor.isServer) {
        Meteor.methods({
            SchoolRegister: function (phone, schoolemail) {
                if (!Meteor.userId()) {
                    throw new Meteor.error('Not authorized');
                    return false;
                }else{

                    NewSchoolDB.insert({
                        authorId: Meteor.userId(),
                        phone: phone,
                        schoolemail
                    });
                }
            }
        });
    }

Это событие для спасения новой школы

//add school
Template.AddSchoolLayout.events({
    'submit .addnewschool': function (event, template) {
        event.preventDefault();

        var newschoolname = trimInput(event.target.newschoolname.value);

        if (isNotEmpty(newschoolname)) {

            Meteor.call('SchoolRegister', newschoolname,
                function (error, response) {
                    if (error) {
                        Bert.alert(error.reason, 'danger', 'growl-top-right');
                        return false;
                    }else{
                        Bert.alert("School successfully created", "success", "growl-top-right");
                        FlowRouter.redirect('/schoolcontact');
                    }
                });

        }
        return false;
    }
});

Здесь я хочу обновить адрес школы

//school contact
Template.SchoolContactLayout.events({
    'submit .contactschool': function (event) {
        event.preventDefault();

        var phone = trimInput(event.target.phone.value);    
        if (isNotEmpty(phone)) {
            Meteor.call('SchoolRegister', phone, function (error, response) {
                if (error) {
                    Bert.alert(error.reason, 'danger', 'growl-top-right');
                    return false;
                }else{
                    Bert.alert('School address updated successfully', 'success', 'growl-top-right');
                    FlowRouter.redirect('/logo-upload');
                }
            });
        }
        return false;
    }
});

Ошибка вошла в консоль

I20170524-17:44:14.051(1)?     at packages/ddp-server/livedata_server.js:559:43
I20170524-17:51:54.678(1)? Exception from sub NewSchoolDB id onFTu2j3xRmbqC5WF TypeError: this.userId is not a function
I20170524-17:51:54.710(1)?     at [object Object]._handler (lib/pulbish/published.js:3:13)
I20170524-17:51:54.712(1)?     at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1737:12)
I20170524-17:51:54.713(1)?     at [object Object]._.extend._runHandler (packages/ddp-server/livedata_server.js:1035:17)
I20170524-17:51:54.714(1)?     at [object Object]._.extend._startSubscription (packages/ddp-server/livedata_server.js:853:9)
I20170524-17:51:54.715(1)?     at [object Object]._.extend.protocol_handlers.sub (packages/ddp-server/livedata_server.js:625:12)
I20170524-17:51:54.719(1)?     at packages/ddp-server/livedata_server.js:559:43

1 ответ

Решение

Ваш метод SchoolRegister принимает 2 аргумента: phone а также schoolmail, Когда вы создаете школу, вы вызываете методы с одним аргументом newschoolname, Так что здесь что-то не так с вашим соглашением об именах, но это не должно иметь большого значения в отношении вашего вопроса.

С MongoDB вы используете insert для добавления новой записи в вашу коллекцию. Если вам нужно обновить его, используйте обновление. Поэтому один из способов решить вашу проблему - это:

  • В AddSchoolLayout вызовите свой метод для первой вставки документа. NewSchoolDB.insert(...) вернет идентификатор созданной записи. Сохраните этот идентификатор и передайте его на следующую страницу, например, в URL.
  • На вашей следующей странице SchoolContactLayoutвам нужно вызвать новый метод, который будет обновлять вашу школу, используя идентификатор, возвращенный предыдущим методом. Этот новый метод будет выглядеть примерно так:

    SchoolUpdate: function (schoolId, phone) {
        if (!Meteor.userId()) {
            throw new Meteor.error('Not authorized');
            return false;
        }else{
            NewSchoolDB.update(schoolId, { $set: { phone } });
        }
    }
    

Первым аргументом функции обновления MongoDB является идентификатор записи, которую вы хотите обновить. Вторые аргументы - это модификаторы, которые вы хотите использовать для обновления вашей записи. Вот полный список модификаторов, которые вы можете использовать: модификаторы обновлений

РЕДАКТИРОВАТЬ: как передать идентификатор из одного макета в другой:

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

Сначала вам нужно определить свой маршрут SchoolContactLayout с чем-то вроде этого:

FlowRouter.route('/schoolcontact/:schoolId', {
  name: 'schoolContact',
});

Это добавляет schoolId Параметр к маршруту.

В вашем методе SchoolRegister получите идентификатор возврата и верните его:

var id = NewSchoolDB.insert({
  authorId: Meteor.userId(),
  schooleName
});
return { id }

Изменить ваше перенаправление FlowRouter.redirect('/schoolcontact'); с FlowRouter.go('/schoolcontact/' + response.id);

Затем вы можете отредактировать событие contactSchool примерно так:

Template.SchoolContactLayout.events({
  'submit .contactschool': function (event) {
     event.preventDefault();

     var schoolId = FlowRouter.getParam('schoolId');
     var phone = trimInput(event.target.phone.value);    
     if (isNotEmpty(phone)) {
       Meteor.call('SchoolUpdate', schoolId ,phone, function (error, response) {
         if (error) {
           Bert.alert(error.reason, 'danger', 'growl-top-right');
           return false;
         }else{
           Bert.alert('School address updated successfully', 'success', 
            'growl-top-right');
           FlowRouter.redirect('/logo-upload');
         }
       });
     }
     return false;
   }
 });

Обратите внимание на var schoolId = FlowRouter.getParam('schoolId'); чтобы получить идентификатор из параметра URL, чтобы я мог использовать его в методе обновления.

Другие вопросы по тегам