Angular 6: Добавление данных в базу данных с использованием идентификатора - PullRequest
0 голосов
/ 28 июня 2018

У меня есть приложение, которое отображает только фильмы из внешнего API, поэтому я добавил раздел комментариев к своему приложению для отдельного фильма, моя проблема в том, когда пользователь вводит комментарий в фильме с именем "TITANIC" Я вижу комментарии, добавленные ко всем фильмам This is wrong, я хочу добавить комментарий к фильму. TITANIC не должен отображаться в других фильмах.

Вот что у меня есть:

server.js ОБНОВЛЕНИЕ

router.post('/comments', function(req, res) {
  var comment = new Comments(req.body);
  comment.save()
   .then(item => {
   res.status(200).json({'comment': 'comment added successfully'});
   })
   .catch(err => {
   res.status(400).send("unable to save to database");
   });

});

service.js

  // Adds comments
      addReview(author, description): Observable<any> {
        const uri = 'http://localhost:8000/movies/comments/';
        const obj = {
          author: author,
          description: description
        };
        return this.http.post(uri, obj);
      }

  // Return Comments
  getComments(id: string): Observable<any> {
    const url = `${apiUrl + this.commentsUrl}/${id}`;
    return this.http.get(url, httpOptions).pipe(
      map(this.extractData),
      catchError(this.handleError));
  }

component.ts

addReview(author, description) {
    this.moviesService.addReview(author, description).subscribe(success => {
        this.flashMessages.show('You are data we succesfully submitted', { cssClass: 'alert-success', timeout: 3000 });
        // get the id
        this.activeRouter.params.subscribe((params) => {
          // tslint:disable-next-line:prefer-const
          let id = params['id'];
          this.moviesService.getComments(id)
            .subscribe(comments => {
              console.log(comments);
              this.comments = comments;
            });
        });
    }, error => {
        this.flashMessages.show('Something went wrong', { cssClass: 'alert-danger', timeout: 3000 });
    });
}

Вопрос

Чего мне не хватает в моем коде?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Вы должны / post к определенному идентификатору фильма, в который вы добавляете новый комментарий, например, под его полем comments .

Кроме того, иметь / comments - плохая практика, поскольку вы действительно хотите опубликовать определенный фильм с прикрепленным к нему комментарием. Примерно так:

router.post('/movie/:id/newcomment:', function(req, res) {
  Movie.findOne({ _id: req.params.id })
      .then(movie => {
         movie.comments.push(req.body.comment);
         movie.save();
             .then(result => {
             res.status(200).json({'message': 'comment added successfully'});})
             .catch(err => {
              res.status(400).send("unable to save to database");
            });
        }
});

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

Вы извлекаете данные из существующего API, но хотите добавить конкретные комментарии к конкретным фильмам из извлеченных данных.

Вы не можете достичь этого, не имея полного контроля над внешним API.

На самом деле вы могли бы создать структуру данных на стороне клиента для хранения всех извлеченных данных, а затем добавить к каждому объекту фильма внутри этой структуры данных еще одно свойство, которое будет называться comments и ID свойство, так что вы можете позже получить доступ к этой структуре данных по ID и обновить определенное свойство.

0 голосов
/ 29 июня 2018

1) Добавьте соответствующий идентификатор фильма в запрос POST, добавив новый комментарий.

addReview(movieId, author, description): Observable<any> {
        const obj = {movieId, author, description};

2) Когда вы запрашиваете комментарии к фильму по его идентификатору, используйте movieId в запросе к базе данных (зависит от вашей базы данных и ORM)

Если вы используете mongodb и mongoose, это будет что-то вроде:

router.get('/comments/:movieId', function(req, res) {
  const movieId= request.params.movieId;
  Comments.find({ movieId });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...