我正在构建一个身份验证后面的FeathersJS服务,非常类似于FeathersJS演示聊天应用程序中的消息服务:https://github.com/feathersjs/feathers-chat/
此外,我想定义一个事件监听器,它应该将收到的消息存储到应用程序的消息服务中,并调用所有必要的挂钩来通知客户端应用程序。
这是我目前的做法:
module.exports = function () {
const app = this;
const Model = createModel(app);
const paginate = app.get('paginate');
const options = {
name: 'messages',
Model,
paginate
};
app.use('/messages', createService(options));
const service = app.service('messages');
service.hooks(hooks);
const sender = new MyExternalMessageSender();
sender.on('message', (msg) => {
service.create(msg, {user: {_id: 0}}).then(result => console.log(result));
});
if (service.filter) {
service.filter(filters);
}
};
这有时可以正常工作,有时只要通知MyExternalMessageSender
并尝试调用邮件服务的create
方法,它就会随机导致错误。
NotAuthenticated: No auth token
at Error.NotAuthenticated (projects\feathers-chat\node_modules\feathers-errors\lib\index.js:100:17)
at projects\feathers-chat\node_modules\feathers-authentication\lib\hooks\authenticate.js:102:31
如果我的应用程序本身不需要使用JWT,如何以正确的方式存储消息?
感谢您的支持!
答案 0 :(得分:1)
我不确定MyExternalMessageSender
是做什么的,但默认情况下在内部服务调用中跳过身份验证 。如果是内部服务,则由params.provider
设置确定。因此,如果您将hook.params
从外部呼叫(其中provider
通常设置为rest
或socketio
)传递到后续服务呼叫,则认证将运行(因为它认为它是外部呼叫)。
这可以通过在传递原始参数之前删除provider
属性来避免,例如与Lodash _.omit:
myservice.find(_.omit(params, 'provider'))