Возврат данных от createAsycnThunk(TypeScript) в зависимости от полученных данных от сервера

  1. Есть createAsyncThunk на TypeScript, который отправит на сервер логин и пароль для регистрации:

      export interface NewUserInterface {
      username: string,
      password: string,
      _id: string,
      createdAt: string,
      updatedAt: string
     }
    
    export interface NewUserDataInterface {
    token: string,
    newUser: NewUserInterface,
    message: string
    }
     export const registerUser = createAsyncThunk<NewUserDataInterface, {username:string, password:string}, {rejectValue:string}>(
             'auth/registerUser', 
             async function ({username, password}, {rejectWithValue}) {
                 try {
                     const response = await instance.post('/register', {
                         username,
                         password
                     })
                     if(response.data.token){
                         window.localStorage.setItem('token', 
         response.data.token)
                 }
    
                 return response.data;
             } catch (error) {
                 return rejectWithValue('')
             }
         }
     )
    
  2. На сервере контроллер обработает запрос, и дальше по логике если такого юзера нет, зарегистрирует нового, если же юзер такой существует то вернет сообщение, что "такой юзер уже есть". На фронте, я в любом случае получу положительный статус и нового юзера или сообщение от сервера. Но в createAsyncThunk я указал, что верну interface который ему передал NewUserDataInterface, по этому при создании юзера все работает, но при регистрации с уже существующим логином все крашится ибо interface который возвращает thunk не такой конструкции как если с сервера приходит одно сообщение. Контроллер:

         export const register = async function (request, response) {
             try {
                 const { username, password } = request.body;
                 const isUser = await User.findOne({username});
                 if(isUser){
                     return response.json({message: 'such user is already exist'})
                 }
                 const salt = bcrypt.genSaltSync(10);
                 const hashPassword = bcrypt.hashSync(password, salt);
                 const newUser = new User({
                     username: username,
                     password: hashPassword
                 });
                 const token = jwt.sign({id: newUser._id}, process.env.JWT_SECRET, {expiresIn: '30d'})
                 await newUser.save();
                 response.json({
                     newUser,
                     token,
                     message: 'user heas been created'
                 })
    
             } catch(error){
                 response.json({message: 'error creating user'})
             }
         }
    
  3. В extrareducers ругается если сервер вернет сообщение, а не полноценного пользователя ибо не знает куда записать action.payload.newUser.username ибо thunk вернул только сообщение

                 .addCase(registerUser.fulfilled, (state, action) => {
                     state.username = action.payload.newUser.username;
                     state.token = action.payload.token;
                     state.status = action.payload.message;
                 })
    

Вопрос, можно ли передать в thunk, передать 2 интерфейса и в зависимости от ответа сервера использовать один из них. Или в таких случаях другой подходи используют?


Ответы (0 шт):