У меня есть рабочий бэкэнд, который работает на Heroku. Клиент является реагирующим приложением.
Все работает нормально, пока не будет сделан конкретный запрос маршрутизатора.
Я прочитал много сообщений о приложениях, работающих локально, но не в Heroku. Разница в том, что я могу заставить мое приложение запускаться и нормально функционировать, пока на сервер не будет сделан определенный пост-запрос.
Это маршрут. Console.logs для отладки. Сначала я хочу убедиться, что пользователь ранее не голосовал по этому конкретному ответу, а затем пользователь может голосовать.
router.post('/:qID/answers/:aID/vote-:dir',function(req, res, next) {
console.log(req.body, "THIS IS THE REQ.BODY");
console.log(req.params.aID);
if(req.params.dir.search(/^(up|down)$/) === -1) {
var err = new Error("Not found");
err.status = 404;
next(err);
} else {
req.vote = req.params.dir;
req.userId = req.body.userId;
next();
}
},
function(req, res, next){
console.log(req.body, "IS THIS THE SAME VALUE?");
try{
User.findById(req.userId, (err, user) => {
if(err){
console.log(err, "IS THIS AN ERROR?");
next(err);
}
if(user.answersVoted.length > 0) {
for(let i = 0; i < user.answersVoted.length; i++){
if (user.answersVoted[i] == req.answer._id){
req.answered = true;
} else {
req.answered = false;
}
} return next();
} else {
updateAnswerArrayandVote(req, res);
}
});
}catch(err){
console.log(err, "IS THIS AN ERROR TOO?");
return next(err);
}
}, function(req, res, next){
if(req.answered){
res.status(422).json({message: "Only vote once!"});
} else {
updateAnswerArrayandVote(req, res);
}
});
Это клиентская сторона
handleVote = (id, dir) => {
if (dir === "up") {
axios.post(`https://sleepy-falls-59530.herokuapp.com/questions/${this.state.id}/answers/${id}/vote-up`, {
userId: this.props.userId
})
.then(res => {console.log(res)})
.catch(err => {
console.log(err);
this.setState({
show: true
})
})
} else {
axios.post(`https://sleepy-falls-59530.herokuapp.com/questions/${this.state.id}/answers/${id}/vote-down`, {
userId: this.props.userId
}).then(res => {console.log(res)})
.catch(err => {
console.log(err);
this.setState({
show: true
})
})
}
}
Это сообщение об ошибке из логов heroku:
]: throw er; // Unhandled 'error' event
2019-07-09T16:04:09.523006+00:00 app[web.1]: ^
2019-07-09T16:04:09.523009+00:00 app[web.1]:
2019-07-09T16:04:09.523012+00:00 app[web.1]: TypeError: Cannot read property 'length' of undefined
2019-07-09T16:04:09.523015+00:00 app[web.1]: at User.findById (/app/routes.js:329:34)
2019-07-09T16:04:09.523017+00:00 app[web.1]: at /app/node_modules/mongoose/lib/model.js:4645:16
2019-07-09T16:04:09.523019+00:00 app[web.1]: at /app/node_modules/mongoose/lib/query.js:4004:12
2019-07-09T16:04:09.523023+00:00 app[web.1]: at process.nextTick (/app/node_modules/mongoose/lib/query.js:2622:28)
2019-07-09T16:04:09.523025+00:00 app[web.1]: at _combinedTickCallback (internal/process/next_tick.js:132:7)
2019-07-09T16:04:09.523027+00:00 app[web.1]: at process._tickCallback (internal/process/next_tick.js:181:9)
2019-07-09T16:04:09.569320+00:00 app[web.1]: npm ERR! code ELIFECYCLE
2019-07-09T16:04:09.570120+00:00 app[web.1]: npm ERR! errno 1
2019-07-09T16:04:09.573462+00:00 app[web.1]: npm ERR! restAPI@1.0.0 start: `node app.js`
2019-07-09T16:04:09.573822+00:00 app[web.1]: npm ERR! Exit status 1
2019-07-09T16:04:09.574525+00:00 app[web.1]: npm ERR!
Кажется, что User.findById () не работает в heroku, так как массив answersVoted для объекта пользователя не определен. Почему это работает локально и, что более важно, как я могу это исправить? Я знаю, что отправляю правильное значение, поскольку console.logs отображаются в журналах (хотя и не включены в этот пост). Заранее спасибо!
РЕДАКТИРОВАТЬ
Итак, логи герою дают мне это:
MuPuLM8q9i6A1a3uFvUzD8K2EbsGkaRt.QlHmBlMi3ry5ZK',
2019-07-10T18:52:49.981062+00:00 app[web.1]: __v: 1,
2019-07-10T18:52:49.981064+00:00 app[web.1]: answersVoted:
2019-07-10T18:52:49.981066+00:00 app[web.1]: [ '5d0bed720498750dbcc31b3e',
2019-07-10T18:52:49.981067+00:00 app[web.1]: '5ceac5948761ba2b4c2f7a7e',
2019-07-10T18:52:49.981069+00:00 app[web.1]: '5d0bed720498750dbcc31b3e',
2019-07-10T18:52:49.981072+00:00 app[web.1]: '5d17524e4dfec60016a07609',
2019-07-10T18:52:49.981074+00:00 app[web.1]: '5d0bed720498750dbcc31b3e',
2019-07-10T18:52:49.981076+00:00 app[web.1]: '5d17524e4dfec60016a07609',
2019-07-10T18:52:49.981078+00:00 app[web.1]: '5cf90359990b3233a0fbb1ce',
2019-07-10T18:52:49.981080+00:00 app[web.1]: '5d17524e4dfec60016a07609' ] } 'THE USER'
2019-07-10T18:52:49.981088+00:00 app[web.1]: THE USER IS A object
2019-07-10T18:52:49.981159+00:00 app[web.1]: undefined 'THE USERS ANSWERSARRAY'
2019-07-10T18:52:49.983370+00:00 app[web.1]: TypeError: Cannot read property 'length' of undefined
И код для этого:
User.findById(req.userId, async (err, user) => {
console.log(user, "THE USER");
console.log("THE USER IS A", typeof user);
console.log(user.answersVoted, "THE USERS ANSWERSARRAY");
Как видите, я могу получить доступ к объекту пользователя с показанным массивом answersVoted.
console.log(user)
Показывает пользователя и все вложенные объекты, в том числе массива answersVoted-10 * *
console.log(user.answersVoted)
не определено.
Асинхронная ошибка или что-то с герокой (так как работает с почтальоном)? Пожалуйста, помогите.