axios post request в наборе инструментов create async thunk redux работает в разработке, но выдает ошибку 504 в производстве на vercel next js
Запрос POST axios в createAsyncThunk отлично работает при разработке, но когда я развертываю сеть на Vercel, он ждет несколько секунд, а затем выдает ответ 504. Вот ответ на производство:
Promise {<pending>, requestId: 'nWTIWtmH2NZYeQlP9E_d-', arg: {…}, abort: ƒ, …}abort: ƒ (a)arg: {username: 'hassan', password: 'admin'}requestId: "nWTIWtmH2NZYeQlP9E_d-"unwrap: ƒ ()[[Prototype]]: Promisecatch: ƒ catch()constructor: ƒ Promise()finally: ƒ finally()then: ƒ then()Symbol(Symbol.toStringTag): "Promise"[[Prototype]]: Object[[PromiseState]]: "pending"[[PromiseResult]]: undefined
POST https://crvsdash.vercel.app/api/adminlogin 504
Я пробовал много вещей, таких как размещение заголовков разрешения перекрестного происхождения, URL-адрес прокси-сервера в пакете JSON, но я не могу понять, почему он не работает в производстве, но отлично работает в разработке. Вот фрагмент инструментов Redux для отправки запроса:
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import axios from 'axios';
const initialState = {
admin: null,
};
export const validateAdmin = createAsyncThunk(
'Admin/validateAdmin',
async (initialCred) => {
console.log(initialCred);
return await axios
.post('/api/adminlogin', {
method: 'POST',
data: initialCred,
})
.then((res) => res.data);
}
);
const adminSlice = createSlice({
name: 'Admin',
initialState,
extraReducers: (builder) => {
builder.addCase(validateAdmin.fulfilled, (state, action) => {
state.admin = action.payload;
});
},
});
export default adminSlice.reducer;
Вот API, который я получаю (следующий API)
import Admin from '../../models/Admin/Admin';
import connectDB from '../../middleware/mongoose';
var CryptoJS = require('crypto-js');
var jwt = require('jsonwebtoken');
const handler = async (req, res) => {
if (req.method == 'POST') {
console.log(req.body);
const admin_user = await Admin.findOne({
username: req.body.data.username,
});
if (admin_user) {
const bytes = CryptoJS.AES.decrypt(
admin_user.password,
process.env.AES_SECRET
);
let decryptedPass = bytes.toString(CryptoJS.enc.Utf8);
if (
req.body.data.username == admin_user.username &&
req.body.data.password == decryptedPass
) {
var token = jwt.sign(
{
username: admin_user.username,
},
process.env.JWT_SECRET,
{
expiresIn: '10d',
}
);
res.status(200).json({ success: true, token });
} else {
res.status(200).json({
success: false,
message: 'Invalid Credentials. Please Try Again.',
});
}
} else {
res.status(200).json({
success: false,
message: `No User Registered with ${req.body.data.username}`,
});
}
} else {
res.status(200).json({ message: 'This method is not allowed' });
}
};
export default connectDB(handler);
Учетные данные тела из формы поступают в преобразователь asnync, но у него есть сложности с отправкой запроса. вот отправка, которую я делаю в своей форме:
const [username, setUsername] = useState('');
const [password, setPassword] = useState('');
const [passwordVisibility, setPasswordVisibility] = useState(false);
const handleChange = (e) => {
if (e.target.name == 'username') {
setUsername(e.target.value);
} else if (e.target.name == 'password') {
setPassword(e.target.value);
}
};
const dispatch = useDispatch();
const handleSubmit = async (e) => {
e.preventDefault();
dispatch(validateAdmin({ username, password }));
};
const admin = useSelector((state) => state.admin.admin);
console.log(admin);
Я пробовал много вещей, но все еще не удалось. Главное, на хероку тоже не заработало. Каждая переменная env введена правильно, я тоже дважды проверил их. И он также отправляет прекрасный запрос в почтальон или Thunderclient.