При отправке запросов POST или GET на наш сервер Express, который обслуживается через PM2 на EC2, Postman получает полный ответ, включая данные JSON, однако наше приложение React (как локально, так и развернутое через CF) получает только код состояния ответа и сообщение и имеет переменную данных в виде пустой строки. Приложение React использует axios для этих вызовов.
Я провел довольно много времени с поддержкой AWS, но мы пришли к выводу, что это не проблема с EC2 или CF.
Я также много раз обсуждал это со своими коллегами, и мы думаем, что это может быть асинхронная проблема, но мы в тупике.
Это вызов на стороне клиента:
export function signIn (data) {
return (dispatch) => {
dispatch(addSignInStatus('PENDING'))
axios.post(`${config.production_url}/api/user/login`, data)
.then(res => {
return dispatch(addSignIn(res.data))
}).catch(err => {
dispatch(addError(err))
return dispatch(addSignInStatus('ERROR'))
})
}
}
А это ответ на стороне сервера:
export function login(req,res){
let username = ''
let password = ''
if(req.body.username && req.body.password){
username = req.body.username;
password = req.body.password;
} else {
res.status(400).json({
message:"Error logging In",
error: "No username or password specified"
});
return;
}
_user.login(username,password).then(data=>{
res.status(200).json(data)
})
.catch(error=>{
res.status(400).json({message:"Error Signing in User",error:error});
});
}
В приложении React сервер отвечает правильным кодом состояния и сообщением, но res.data возвращается в виде пустой строки, а в Firefox выдается эта ошибка:
SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data
Сервер должен отвечать объектом JSON, подобным следующему:
{
"message": "Sign-in Successful",
"user": {
"skills": [],
"social": [],
"wallets": [],
"followers": [],
"following": [],
"groupsOwned": [],
"groupsJoined": [],
"starred": [],
"pinned": [],
...
},
...
}
и это происходит, когда запрос отправляется через Почтальон.
Edit:
Сервер принимает запросы с разными источниками:
app.use(cors());
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
Редактировать 2 РЕШЕНИЕ:
Оказалось, что это проблема с библиотекой npm "сжатие"