Как создать несколько клиентских подключений Feathers? - PullRequest
0 голосов
/ 30 марта 2019

У меня есть EventListener для бота Slack, который прослушивает входящие сообщения:

slackEvents.on('message', (message: any, body: any) => {
  BotMessageInterpreter.handleIncomingMessage(app, message, body);
});

Затем создает экземпляр бота на основе платформы, с которой приходит сообщение (slack не единственный). Я хочу аутентифицировать пользователя, написавшего сообщение, чтобы он, например, мог получить свои сообщения во входящих. Там может быть много аутентификаций происходит, так как там может быть много сообщений от разных пользователей.

static handleIncomingMessage(app: any, message: any, body: any): void { 
    const bot = BotRequestFactory.createBotRequest(body.token);
    const authentication = bot.authenticate(body.email, body.password);

    if (authentication instanceof Error) {
      console.log('Error creating bot. Unknown type.');
    } else if (!authentication) {
      bot.sendMessageToPlatform(body, 'Error: Could not authenticate you.');
    } 

    bot.sendMessageToPlatform(body.event, message.text);
  }

Различные классы типов ботов выглядят так:

import request from 'request';

import { Authentication } from '../authentication';

export class BotType1 {
  private data: any;
  private app: any;
  private authentication: any;

  constructor(app: any, data: any) {
    this.app = app;
    this.data = data;
    this.authentication = new Authentication(app);
  }

  public authenticate(email: string, password: string): boolean {
    // Unique payload specific to Slack
    const payload = {
      strategy: 'local',
      email: process.env.FEATHERS_AUTHENTICATION_EMAIL,
      password: process.env.FEATHERS_AUTHENTICATION_PASSWORD
    };

    // Authenticate
    const success = this.app.authenticate(payload)
    .then((response: any) => { 
      return true; 
    })
    .catch((e: any) => {
      console.log('Error. Could not authenticate the user.');
      return false; 
    });

    return success;
  }
}

В первый раз работает нормально, но во второй раз, когда я отправляю сообщение и вызывается метод аутентификации, я получаю следующую ошибку:

Error: Only one default client provider can be configured
    at Function.initialize (/Users/test/Documents/projects/bot/node_modules/@feathersjs/client/dist/feathers.js:4993:13)
    at Function.configure (/Users/test/Documents/projects/bot/node_modules/@feathersjs/client/dist/feathers.js:3507:8)
    at new Authentication (/Users/test/Documents/projects/bot/app/classes/authentication.ts:14:13)
    at new SlackBotRequest (/Users/test/Documents/projects/bot/app/classes/bot-engine/bot-request.ts:14:31)
    at Function.createBotRequest (/Users/test/Documents/projects/bot/app/classes/bot-engine/bot-request-factory.ts:9:24)
    at Function.handleIncomingMessage (/Users/test/Documents/projects/bot/app/classes/bot-engine/bot-message-interpreter.ts:7:61)
    at SlackEventAdapter.slackEvents.on (/Users/test/Documents/projects/bot/app/app.ts:42:57)
    at emitTwo (events.js:126:13)
    at SlackEventAdapter.emit (events.js:214:7)
    at /Users/test/Documents/projects/bot/node_modules/@slack/events-api/dist/http-handler.js:244:22

Это мой файл аутентификации:

const io = require('socket.io-client');
const feathers = require('@feathersjs/client');
const localStorage = require('localstorage-memory');

export class Authentication {
  private socket: any;
  private client: any;
  protected app: any;

  constructor(app: any) {
    this.app = app;
    this.client = feathers();

    this.socket = io('http://localhost:3030/', {
      transports: ['websocket'],
      forceNew: true
    });

    app.configure(feathers.socketio(this.socket), {
      timeout: 10000
    });

    app.configure(feathers.authentication({
      jwtStrategy: 'jwt',
      storage: localStorage,
      storageKey: 'bot-token'
    }));
  }

}

По какой причине я получаю эту конкретную ошибку и как я могу ее исправить? Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...