channels.js returns 中的连接未定义?

connection in channels.js returns undefined?

I'm trying to establish a real-time socket connection to my client side via feathers channels. It works without any sort of authentication. But if i add the following login action scoket is throwing a weak map key error.

app.on('login', (authResult, { connection }) => {
 console.log(connection) // returns undefined
 ....
})

这是我收到的错误

Unhandled Rejection at: Promise Promise { TypeError: Invalid value used as weak map key at WeakMap.set ()

  app.on('login', (authResult, { connection }) => {
    console.log("============>>", connection)
    if (authResult && connection) {
      app.channel('anonymous').leave(connection);
      if (authResult.user && authResult.user['chanelName']) {
        let channelName = authResult.user['chanelName'].toString();
        channelName = channelName.substr(0, 5)
        app.channel(`channel/${channelName}`).join(connection);
      } else
        app.channel('authenticated').join(connection)
    }
  });

连接对象未定义,我认为这是导致问题的原因。 阿努建议?

请提供客户端脚本。 根据 fethers 文档,如果没有 real-time 连接,则可以未定义连接,例如通过 REST 登录时。

您应该验证您的客户端。

示例脚本

const feathers = require('@feathersjs/feathers');
const socketio = require('@feathersjs/socketio-client');
const io = require('socket.io-client');
const auth = require('@feathersjs/authentication-client');
const socket = io('http://localhost:3031');
const app = feathers();
// Setup the transport (Rest, Socket, etc.) here
app.configure(socketio(socket));
const options = {
  header: 'Authorization', // the default authorization header for REST
  prefix: '', // if set will add a prefix to the header value. for example if prefix was 'JWT' then the header would be 'Authorization: JWT eyJ0eXAiOiJKV1QiLCJhbGciOi...'
  path: '/authentication', // the server-side authentication service path
  jwtStrategy: 'jwt', // the name of the JWT authentication strategy 
  entity: 'user', // the entity you are authenticating (ie. a users)
  service: 'users', // the service to look up the entity
  cookie: 'feathers-jwt', // the name of the cookie to parse the JWT from when cookies are enabled server side
  storageKey: 'feathers-jwt', // the key to store the accessToken in localstorage or AsyncStorage on React Native
  storage: undefined // Passing a WebStorage-compatible object to enable automatic storage on the client.
}
app.configure(auth(options))
app.authenticate({
  strategy: 'jwt',
  accessToken: '<JWT TOKEN>'
}).then(() => {
  console.log("Auth successfull")
  const deviceService = app.service('myService');
  deviceService.on('created', message => console.log('Created a message', message));
}).catch(e => {
  console.error('Authentication error', e);
  // Show login page
});

希望对您有所帮助。