POST-данные с данными пользователя в mongo db с использованием node.js - PullRequest
0 голосов
/ 08 октября 2018

Я занимаюсь разработкой веб-приложения с использованием стека MEAN с Angular 6. У меня есть форма для отправки данных в MongoDB.Ниже приводится функция сохранения, и она работает.Сохраняет выдавленное значение в БД.

saveExtrudedHeightValue(extrudedHeight: NgForm) {
  if (extrudedHeight.value != "" && extrudedHeight.value != null) {
    this.extrudedHeightService.saveExtrudedHeight(extrudedHeight.value).subscribe(res => {
      console.log(res);
    }, (err) => {
      console.log(err);
    });
  }
}

Вот модель

// Schema for extruded height panel
var extrudedHeightSchema = new mongoose.Schema({
  userName: {
    type: String
  },
  extrudedHeight: {
    type: Number
  },

});
module.exports = mongoose.model('extrudedHeightValue', extrudedHeightSchema);

Вот мой пост по маршруту

//post extrudedHeight values
router.post("/save", function(req, res) {
  var mod = new extrudedHeight(req.body);

  extrudedHeight.findOneAndUpdate({
      userName: req.body.email,
      extrudedHeight: req.body.extrudedHeight,
    },
    req.body, {
      upsert: true,
      new: true
    },
    function(err, data) {
      if (err) {
        console.log(err);
        res.send(err);
      } else {

        res.send(mod);
      }
    }
  );
});

Вот сервис.

// service for save extruded height 
saveExtrudedHeight(extrudedHeight): Observable < any > {
  return this.http.post('/extrudedHeight/save', extrudedHeight, httpOptions)
    .pipe(
      catchError(this.handleError)
    );
}

Теперь я хочу сохранить данные в БД с текущим пользователем userName.По этому я могу получить userName текущего пользователя.this.payload.user['email'] Моя проблема в том, что я не представляю, как передать этот userName для публикации маршрута для сохранения в БД.

Здесь я получаю токен.

this.authService.onTokenChange().subscribe(
  (token: NbAuthJWTToken) => {
    if (token.isValid()) {
      this.user = token.getPayload().user;
      this.payload = token.getPayload();
      console.log(this.payload.user['email']);
    }
  }
)

1 Ответ

0 голосов
/ 08 октября 2018

Вы можете сначала вызвать this.authService.onTokenChange внутри метода saveExtrudedHeight, а затем использовать оператор flatMap, чтобы развернуть внутренний Observable, который будет возвращен http.post.

Это может привести к следующему коду:

import { flatMap } from 'rxjs/operators';
import { throwError } from 'rxjs';

...

saveExtrudedHeight(extrudedHeight): Observable<any> {
  const requestPayload = {
    extrudedHeight
  };
  return this.authService.onTokenChange()
    .pipe(flatMap(
    (token: NbAuthJWTToken) => {
      if (token.isValid()) {
        this.user = token.getPayload().user;
        this.payload = token.getPayload();

        const email = this.payload.user['email'];
        requestPayload.email = email;

        // Make the changes here to send the email as the Request Payload.

        return this.http.post('/extrudedHeight/save', requestPayload, httpOptions)
          .pipe(
            catchError(this.handleError)
          );
      } else {
        throwError('Something went wrong!');
      }
    }
  ));
}

PS: Я не совсем уверен, сработает ли это, хотя я не проверял егои я не могу без минимального рабочего StackBlitz.

...