MEAN стек, как найти _id из базы данных для отправки запроса PUT - PullRequest
0 голосов
/ 23 января 2020

У меня проблема с определением «задачи» в mongoDB из моего интерфейса angular.

Этот вопрос наиболее похож на мой вопрос, но здесь он просто говорит req.body.id и на самом деле не объясняет, как они это получили.

Этот вопрос касается того, что я пытаюсь сделать: обновить один документ в коллекции одним щелчком мыши. То, что он делает во внешнем интерфейсе, не важно. Я просто хочу изменить текст состояния задачи с "Active" на "Completed" onclick.

Сначала я создаю задачу и вставляю ее в свою коллекцию базы данных с таким кодом:

createTask(): void {
    const status = "Active";
    const taskTree: Task = {
      _id: this._id,
      author: this.username,
      createdBy: this.department,
      intendedFor: this.taskFormGroup.value.taskDepartment,
      taskName: this.taskFormGroup.value.taskName,
      taskDescription: this.taskFormGroup.value.taskDescription,
      expectedDuration: this.taskFormGroup.value.expectedDuration,
      status: status
    };   
    this.http.post("/api/tasks", taskTree).subscribe(res => {
      this.taskData = res;
    });
  }

Когда я делаю этот пост в бэкэнде, _id волшебным образом заполняется! Я просто не уверен, как я могу передать идентификатор запросу put в nodejs router.put('/:id'), когда я выталкиваю его из внешнего интерфейса следующим образом:

completeTask(): void {
    const status = "Completed";
    const taskTree: Task = {
      _id: this._id,
      author: this.username,
      createdBy: this.department,
      intendedFor: this.taskFormGroup.value.taskDepartment,
      taskName: this.taskFormGroup.value.taskName,
      taskDescription: this.taskFormGroup.value.taskDescription,
      expectedDuration: this.taskFormGroup.value.expectedDuration,
      status: status
    }; 
    console.log(taskTree);


    this.http.put("/api/tasks/" + taskTree._id, taskTree).subscribe(res => {
      this.taskData = res;
      console.log(res);

    });
  }

В шаблоне у меня есть заполненная форма и данные сразу же выводятся на «карточку» задачи на той же странице.

Когда я отправляю запрос на поставку из angular, я получаю ответ в бэкэнде, просто отлично от ответа Я запрашиваю в task-routes.js:

router.put("/:id", (req, res, next) => {
    const taskData = req.body;
    console.log(taskData);

    const task = new Task({
        taskId: taskData._id,
        author: taskData.author,
        createdBy: taskData.createdBy,
        intendedFor: taskData.intendedFor,
        taskName: taskData.taskName,
        taskDescription: taskData.taskDescription,
        expectedDuration: taskData.expectedDuration,
        status: taskData.status
    })

    Task.updateOne(req.params.id, {
        $set: task.status
    },
    {
        new: true
    },
    function(err, updatedTask) {
        if (err) throw err;
        console.log(updatedTask);   
    }
    )

});

Общий ответ, который я получаю для обновленной информации:

{
  author: 'there's a name here',
  createdBy: 'management',
  intendedFor: null,
  taskName: null,
  taskDescription: null,
  expectedDuration: null,
  status: 'Completed'
}

Теперь я знаю, _id автоматически создается в базе данных, поэтому здесь, когда Я нажимаю «создать задачу», и она выводится на «карточку», в журнале консоли task, после того как я save() отправил ее по запросу, появляется 1032 *. Это все прекрасно, но мне нужно отправить уникальный идентификатор из интерфейса Задачи внешнего интерфейса, поэтому, когда я отправляю запрос 'put', nodejs получает тот же идентификатор, что и 'post'ed.

I Я совершенно сбит с толку.

1 Ответ

0 голосов
/ 29 января 2020

Итак, я наконец-то понял это ... На случай, если кому-то это поможет, вот что наконец-то сработало:

Сначала я переместил свою функцию обновления и (исправление вместо пут) запрос в службу триггеров:

Служба триггера

tasks: Task[] = [];

updateTask(taskId, data): Observable<Task> {    
    return this.http.patch<Task>(this.host + "tasks/" + taskId, data);
  }

Я также создал запрос на получение в файле службы триггера, чтобы найти все документы в коллекции:

getTasks() {
    return this.http.get<Task[]>(this.host + "tasks");
  }

Angular компонент

Получить задачи в ngOnInit, чтобы отобразить их при загрузке компонента:

ngOnInit() {
    this.triggerService.getTasks().subscribe(
      tasks => {
        this.tasks = tasks as Task[];
        console.log(this.tasks);
      },
      error => console.error(error)
    );
}

Обновление:

completeTask(taskId, data): any {
    this.triggerService.updateTask(taskId, data).subscribe(res => {
      console.log(res);
    });
  }

Angular шаблон (html)

<button mat-button
            class="btn btn-lemon"
            (click)="completeTask(task._id)"
            >Complete Task</button>
// task._id comes from `*ngFor="task of tasks"`, "tasks" being the name of the array 
//(or interface array) in your component file. "task" is any name you give it, 
//but I think the singular form of your array is the normal practice. 

Внутренние маршруты

ПОЛУЧИТЬ все задачи:

router.get("", (req, res, next) => {
  Task.find({})
    .then(tasks => {
      if (tasks) {
        res.status(200).json(tasks);
      } else {
        res.status(400).json({ message: "all tasks not found" });
      }
    })
    .catch(error => {
      response.status(500).json({
        message: "Fetching tasks failed",
        error: error
      });
    });
});

Обновление 1 поле в указанном документе (статус от «Активный» до «Завершено»):

router.patch("/:id", (req, res, next) => {
  const status = "Completed";

  console.log(req.params.id + " IT'S THE ID ");

  Task.updateOne(
    { _id: req.params.id },
    { $set: { status: status } },
    { upsert: true }
  )
    .then(result => {
      if (result.n > 0) {
        res.status(200).json({
          message: "Update successful!"
        });
      }
    })
    .catch(error => {
      res.status(500).json({
        message: "Failed updating the status.",
        error: error
      });
    });
});

Надеюсь, это кому-нибудь поможет!

...