findOneAndUpdate, кажется, работает Robo 3T, но POST-запрос приводит к «Ожиданию» через Axios - PullRequest
1 голос
/ 13 апреля 2020

Я немного озадачен, и мне было интересно, если кто-нибудь может помочь. Всякий раз, когда я вызываю сообщение ax ios, вкладка сети показывает, что запрос находится на рассмотрении и в конечном итоге терпит неудачу. Когда я пытаюсь сделать тот же звонок через Robo 3T, он успешно обновляется.

Может кто-нибудь подсказать мне? Спасибо!

Вот маршрут, который я использую:

router.post('/upvote/reply/id/:id',
    // passport.authenticate('jwt', { session: false }), 
    async (req, res) => {
        await Posts.findOneAndUpdate(
            { "comments._id": mongoose.Types.ObjectId(req.params.id) },
            {
                $inc: { "comments.$.points": 1 },
                $push: { "comments.$.upvotedBy": req.user._id },
                $pull: { "comments.$.downvotedBy": req.user._id },
            },
            (err, result) => {
                if (err) {
                    return res.status(404).json({
                        success: false,
                        error: err,
                        message: 'Post not upvoted!',
                    })
                }
                else {
                    return res.status(200).json({
                        success: true,
                        data: result
                    })
                }
            })
            .catch(err => console.log(err))
    })

Вот как я вызываю мой маршрут API:

handleReplyUpvote = (id) => {
        this.setState(prevState => {
            const updatedReplies = prevState.replies.map(item => {
                if (item._id === id) {
                    try {
                        axios
                            .post(`http://localhost:5000/api/posts/upvote/reply/id/${id}`)
                            .then(res => {
                                // console.log(res.data.data[0].comments[0])
                                console.log(res)
                                // ...item,
                                // const {posts} = this.state
                                // posts.push(res.data)
                                // this.setState({posts})
                            })
                    }
                    catch (err) {
                        console.log(err)
                    }
                    return {
                        ...item,
                        // voted: true,
                        points: item.points + 1
                    }
                }
                return item
            })
            return {
                replies: updatedReplies
            }
        })
        // console.log('boops')
    }

Еще немного кода контекста что может помочь:

const replies = this.state.replies.slice().map((item, i) =>
            <div 
                key={i}
                className='replyItem'
            >
                <Reply
                    // key={i}
                    reply={item.reply}
                    id={item._id}
                    user_id={item.user_id}
                    createdAt={item.createdAt}
                    points={item.points}
                    handleDelete={() => this.handleDelete(item._id)}
                    user={this.props.auth}
                    handleReplyUpvote={() => this.handleReplyUpvote(item._id)}
                    // handleDownvote={() => this.handleReplyDownvote(item._id.points)}
                />
            </div>
        )

1 Ответ

1 голос
/ 13 апреля 2020

Вы смешиваете асинхронные / ожидающие, обещания и обратные вызовы. Используйте либо обещания, либо asyns / await, но не все. Я исправил несколько вещей, и это должно работать. (Я не проверял это все же)

router.post("/upvote/reply/id/:id", async (req, res) => {
    try {
        const result = await Posts.findOneAndUpdate(
            { "comments._id": mongoose.Types.ObjectId(req.params.id) },
            {
                $inc: { "comments.$.points": 1 },
                $push: { "comments.$.upvotedBy": req.user._id },
                $pull: { "comments.$.downvotedBy": req.user._id },
            }
        );
        return res.status(200).json({
            success: true,
            data: result,
        });
    } catch (error) {
        return res.status(404).json({
            success: false,
            error: error.message,
            message: "Post not upvoted!",
        });
    }
});



handleReplyUpvote = async(id) => {
  const updatedReplies = [];
  for(const item of this.state.replies){
    if(item._id === id){
      try{
        const response = await axios
          .post(`http://localhost:5000/api/posts/upvote/reply/id/${id}`)
        console.log(response.data);
      }catch(error){
        console.log(error.message);
      }
      updatedReplies.push({
        ...item,
        points: item.points + 1;
      })
      continue;
    }
    updatedReplies.push(item);
  }
  this.setState({
    replies: updatedReplies
  })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...