whatwewant / dva-socket.io

A socket.io plugin for dva
14 stars 5 forks source link

how to set app.use(createSocket(url)) when logined #2

Closed Elvin1993 closed 6 years ago

Elvin1993 commented 6 years ago

how to set app.use(createSocket(url)) when logined

你好 whatwewant . 请问我要怎么设置这个token? 当我登录之后 。


import dva from 'dva';
import createSocket from 'dva-socket.io';

const options = { extraHeaders: { TOKEN: 'xxx' }, }; // need after logined, can get TOKEN //and how to set TOKEN ? app.use(createSocket('ws://xxx', options)); app.start('#root');

whatwewant commented 6 years ago

是socket.io的问题,官方有答案 socket.io-client extraHeaders

const options = {
  transportOptions: {
    polling: {
      extraHeaders: {
        TOKEN: 'xxx'
      }
    }
  }
};
Elvin1993 commented 6 years ago

感谢回复 !

现在遇到一个问题 ;

因为 app.use(createSocket('ws://xxx', { transportOptions: { polling: { extraHeaders: { TOKEN: '默认值' } } } };)); 的时候 socket 就已经创建并连接了 这个时候TOKEN是‘默认值'’。
正确的TOKEN 应该是 用户登录之后拿到TOKEN

个人觉得正确的流程 应该时候

step 1 启动


import dva from 'dva';

app.start('#root');


> step 2  登录后 拿到token再注册 dva-socket.io
```javascript
import createSocket from 'dva-socket.io';
import dva from 'dva';

// 登录模块的 model
export default {
  namespace: 'login',
  effects: {
    *login({payload}, { call, put }) {
          const response = yield call(login, payload);
          const { TOKEN } = response.data; // 登录成功之后 拿到token
          const options = {
            // extraHeaders: {
            //   'TOKEN': TOKEN
            // },
            transportOptions: {
              polling: {
                extraHeaders: {
                  'TOKEN': TOKEN
                }
              }
            }
          }; 
          // 这一步 应该是有问题。因为执行之后 socket是能连接 但是 在其他模块 `dispatch({type: 'sendMessage'})` socket 事件没反应
          // 应该是插件没成功注入dva, 或者是注入了重新 new 的dva
          const app = dva();  // 如果能拿到 step 1 的app 就好了, 请教。
          app.use(createSocket('ws://xxx', options));

          // 上面代码跟这个写法是一样的
          // createSocket('ws://xxx', options)
        },
      }
}
whatwewant commented 6 years ago

好问题,确实有这样的需求,两个问题: 1 app 实例问题: dva 的 app 实例其实是可以拿到的,只要export出来,在effect中import;

2 存在设计缺陷: 虽然1可以拿到app实例,但是用法比较奇怪,而这个库一开始设计确实没有考虑先授权再登陆,后来也发现了这个问题,已重构,目前还在内测中,这段时间会发新版本.

大概用法(可能会有变化):

// 普通 dispatch
dispatch({ type: 'SOCKET_IO/INIT', payload: SOCKET_IO_OPTIONS });
whatwewant commented 6 years ago

如果有好的idea 欢迎提PR

elvin-gogo commented 6 years ago

可以close了