2015-04-26 3 views
0

У меня есть метод, определенный в серверных/методов/methods.js:Почему мой метод Метеор 404

Meteor.methods({ 
    'createRole': function(name) { 
    if (this.connection && !Roles.userIsInRole(this.userId, 'manage-users')) { 
     throw new Meteor.Error('Not authorized to create user roles'); 
    } else if (!Meteor.roles.find({name: name}).count()) { 
     Roles.createRole(name); 
     var admins = Meteor.users.find({ emails: { $elemMatch: { address: { $in: _.pluck(Meteor.settings.admins, 'email')}}}}).fetch(); 
     return Roles.addUsersToRoles(admins, name); 
    } 
    }, 

Я называю этот метод в сервере/Config/roles.js:

var roles = [ 
    'manage-users', 
    'schedule-any', 
    'edit-any', 
    'delete-any', 
    'manage-settings', 
    'schedule-own', 
    'edit-own', 
    'delete-own' 
    ]; 

// Creates any roles in the list that don't exist 
roles.forEach(function(role) { 
    if (!Meteor.roles.find({name: role}).count()) { 
    Meteor.call('createRole', role); 
    } 
}); 

В результате получается 404 со следующей трассировкой стека:

W20150426-12:19:18.264(-4)? (STDERR) Error: Method not found [404] 
W20150426-12:19:18.264(-4)? (STDERR) at [object Object]._.extend.apply (/private/var/folders/21/_h470ps14cn22051frhwhrfr0000gn/T/meteor-test-runsw86fl/.meteor/local/build/programs/server/packages/ddp.js:2330:19) 
W20150426-12:19:18.264(-4)? (STDERR) at [object Object]._.extend.call (/private/var/folders/21/_h470ps14cn22051frhwhrfr0000gn/T/meteor-test-runsw86fl/.meteor/local/build/programs/server/packages/ddp.js:2300:17) 
W20150426-12:19:18.264(-4)? (STDERR) at Accounts.onCreateUser.email (app/server/config/roles.js:17:12) 
W20150426-12:19:18.264(-4)? (STDERR) at Array.forEach (native) 
W20150426-12:19:18.264(-4)? (STDERR) at app/server/config/roles.js:15:7 
W20150426-12:19:18.265(-4)? (STDERR) at app/server/config/roles.js:42:3 
W20150426-12:19:18.265(-4)? (STDERR) at /private/var/folders/21/_h470ps14cn22051frhwhrfr0000gn/T/meteor-test-runsw86fl/.meteor/local/build/programs/server/boot.js:222:10 
W20150426-12:19:18.265(-4)? (STDERR) at Array.forEach (native) 
W20150426-12:19:18.265(-4)? (STDERR) at Function._.each._.forEach (/Users/raddevon/.meteor/packages/velocity_meteor-tool/.1.1.3_2.mgkc7d++os.osx.x86_64+web.browser+web.cordova/mt-os.osx.x86_64/dev_bundle/server-lib/node_modules/underscore/underscore.js:79:11) 
W20150426-12:19:18.266(-4)? (STDERR) at /private/var/folders/21/_h470ps14cn22051frhwhrfr0000gn/T/meteor-test-runsw86fl/.meteor/local/build/programs/server/boot.js:117:5 
W20150426-12:19:18.266(-4)? (STDERR) 
=> Exited with code: 8 

Почему я не могу назвать этот метод? Я могу вызвать другие методы в server/startup/startup.js, поэтому я смущен, почему я не могу назвать этот конкретный метод здесь.

+0

Выполняется ли код в 'role.js', как только файл оценивается, или является частью обратного вызова? –

+0

@DavidWeldon Это не в обратном вызове. Я должен работать, когда файл оценивается. – raddevon

ответ

1

server/config/roles.js вычисляется перед server/methods/methods.js (они имеют одинаковый уровень вложенности и «конфигурации» в алфавитном порядке, прежде чем «методы»), следовательно, этот метод не определенный во время вызова. Простое решение, это просто вызвать метод в Meteor.startup обратного вызова:

Meteor.startup(function() { 
    roles.forEach(function(role) { 
    if (!Meteor.roles.find({name: role}).count()) { 
     Meteor.call('createRole', role); 
    } 
    }); 
}); 

Это обеспечит все файлы были оценены до выполнения roles кода. Альтернативные решения включают перемещение вашего определения метода внутри каталога lib или добавление его в пакет.

0

Попробуйте запустить его в Meteor.startup

Meteor.startup(function() { 
    roles.forEach(function(role) { 
     if (!Meteor.roles.find({name: role}).count()) { 
      Meteor.call('createRole', role); 
     } 
    }); 
}); 
Смежные вопросы