Обновление документа в mongodb - PullRequest
0 голосов
/ 05 мая 2018

Для школы я делаю проект на Angular с конкретными целями, у нас не было много уроков, поэтому я все еще начинающий. Мой проект почти завершен, но я наткнулся на обновление моего документа в базе данных MongoDB. Мой проект - это своего рода сайт сообщества, который вы можете сравнить с Reddit. Таким образом, можно также проголосовать за сообщение, сделанное пользователем.

Теперь дело в том, что я не могу поднять свой пост. Я получаю ошибку:

this._spell.toJSON is not a function.

Для обновления я использую вызов PUT, но я никогда не видел этого в классе, поэтому я искал его в Интернете и пытался реализовать его. Мой бэкэнд-звонок с Бессонницей работает, и моя Почта получает голосование. Но когда я пытаюсь вызвать API в своем интерфейсе, я получаю эту ошибку.

Я прочитал несколько веб-сайтов и через Stackoverflow, но все еще не нашел решения для моей проблемы.

Мой код

Код post.component, получающий событие:

upvote() {
  this.post.upvote();
  this._dndDataService.upvote(this.post.id, this.post).subscribe();
}

Post.Model, имеющая from и toJson

toJSON() {
  return {
    title: this._title,
      originalPoster: this._originalPoster,
      category: this._category,
    comments: this._comments.map(i => i.toJSON()), //fixen indien null
    spell: this._spell.toJSON(),
    dateCreated: this._dateCreated,
    votes: this._votes
  }
}

static fromJSON(json: any): Post {
  const post = new Post(
    json.title,
    json.originalPoster,
    json.category,
    json.spell,
    json.dateCreated
  );
  post._id = json._id;
  post._votes = json.votes;
  post._comments = json.comments.map(Comment.fromJSON); //fixen indien null
  return post;
}

Мой dndDataService вызывает мой бэкэнд, это почти то же самое, что и метод POST для создания сообщений. Я также использую map((p:any) : Post => Post.fromJSON(p)), и здесь я не получаю ошибку, упомянутую выше.

upvote(id: string, post: Post): Observable<Post> {
  const theUrl = `${this._appUrl}/post/${id}/vote`;
  return this.http.put(theUrl, post)
    .pipe(map((p:any) : Post => Post.fromJSON(p)));
}

Теперь приходит мой внутренний вызов, который получает сообщение целиком и обновляет базу данных. Я использую функцию router.param, чтобы получить сообщение с правильным идентификатором, это работает, поскольку я использую его для нескольких целей:

router.put('/API/post/:id/vote', function (req, res) {
  Post.update({
    $set: {
      votes: req.post}
    },
    function (err, post) {
      if(err)
        res.send("Error updating post");
      res.json(post);
    })    
});

Я даже послал своего учителя за помощью по обновлению этого кода, но он все равно не работает. Я очень надеюсь, что некоторые из вас смогут мне помочь.

Если вам нужен весь мой код, скажите, что вам нужно, и я обновлю свой пост.

Также можно найти мой код на: https://github.com/SFieuws/WebsiteDnd

1 Ответ

0 голосов
/ 06 мая 2018

Я исправил это так, что отправлял не весь пост на свой сервер, а только голоса. Во-вторых, неправильно получать мой пост с идентификатора, потому что при этом я назвал свое старое количество голосов глупой ошибкой.

Служба данных

upvoteComment(id: string, points: Number): Observable<Comment> {
  const theUrl = `${this._appUrl}/comments/${id}/vote`;
  return this.http.patch(theUrl, {points})
    .pipe(map((c:any) : Comment => Comment.fromJSON(c)));
}

Backend Patch Call

router.patch('/API/post/:post/vote', auth, function (req, res) {
  let query =  Post.findById(req.params.post).populate("comments").populate("spell");
  query.exec(function(err, post){
    if(err) res.send("Post not found");
    post.votes = req.body.votes;
    post.save(function(err, result){
      if(err) res.send("Error updating post"); 
      res.send(post);
    })
  });
});
...