J'utilise donc un passe-partout react-redux doté d'un assistant ApiClient. Cela ressemble à ceci:
export default class ApiClient {
constructor(req) {
/* eslint-disable no-return-assign */
methods.forEach((method) =>
this[method] = (path, withCredentials, { params, data } = {}) => new Promise((resolve, reject) => {
const request = superagent[method](formatUrl(path))
if (withCredentials) {
console.log('first of all, its true')
console.log(this)
}
if (params) {
request.query(params)
}
if (__SERVER__ && req.get('cookie')) {
request.set('cookie', req.get('cookie'))
}
if (data) {
request.send(data)
}
request.end((err, { body } = {}) => {
return err ? reject(body || err) : resolve(body)
})
}))
/* eslint-enable no-return-assign */
}
/*
* There's a V8 bug where, when using Babel, exporting classes with only
* constructors sometimes fails. Until it's patched, this is a solution to
* "ApiClient is not defined" from issue #14.
* https://github.com/erikras/react-redux-universal-hot-example/issues/14
*
* Relevant Babel bug (but they claim it's V8): https://phabricator.babeljs.io/T2455
*
* Remove it at your own risk.
*/
empty() {}
}
Je veux le connecter à mon authentification afin de pouvoir ajouter des en-têtes aux points de terminaison protégés, comme ceci:
@connect(state => ({ jwt: state.auth.jwt }))
export default class ApiClient {
...
Cependant, lorsque je fais cela, j'obtiens l'erreur: Cannot read property 'store' of undefined
. Que se passe t-il ici? Pourquoi ne puis-je pas connecter une classe régulière au magasin redux?
pdate: voici ma fonction de connexion, qui utilise l'assistant ApiClient:
export function loginAndGetFullInto(email, password) {
return dispatch => {
return dispatch(login(email, password))
.then(() => {
return dispatch(loadUserWithAuth())
})
}
}
J'ai besoin d'un moyen de passer soit le magasin, soit le jwt, dans la fonction loadUserWithAuth
...
La fonction connect
ne fonctionnera pas avec autre chose que React composants. Ce que vous pouvez faire est de passer votre instance de magasin à votre classe et d'appeler store.dispatch
, store.getState
, et store.subscribe
directement.
Gardez à l'esprit que si vous vous abonnez, vous devez également avoir des fonctionnalités pour vous désabonner, sinon votre magasin contiendra une référence à votre instance de classe pour toujours, créant une fuite de mémoire.