Проблема отправки ответа API в mongoDb. - PullRequest
0 голосов
/ 01 октября 2018

Я использую mongodb для make backend API.И я использовал bluebird, чтобы использовать обещание.

return new promise((resolve, reject) => {

    db.collection('employee').find({
        email: data.email
    }).toArray().then((checkEmail) => {
        if (checkEmail.length > 0) {                
            res.send({ status: 0, message: 'Employee already exist.' });
            // I want to stop my node hear. 
            // I have tried return false , but not works.
        }
    }).then(() => {
        // Add employee details into collection as a new employee. 
        return db.collection('employee').insert({
            //...
        })
    }).then((employee) => {
         // Other stuff
    }).catch((error) => {
        console.log(error)
        res.send({ status: 0, message: 'Something went wrong.' });
    });;
}

Как видите, если checkEmail > 0, то я получил ответ, который получил должным образом в почтальоне.Но все же мой узел - это выполнение следующего кода.

Так, как я мог остановить следующее выполнение, когда я посылаю res назад.

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

Error: Can't set headers after they are sent.

Я пытался использовать return, return false.Но он все еще выполняет мой следующий код.

Ответы [ 2 ]

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

Вы можете просто разветвлять свое обещание как

db.collection('employee')
.find({
    email: data.email
 })
.toArray()
.then((checkEmail) => {
   if (checkEmail.length > 0) {                
     return res.send({ status: 0, message: 'Employee already exist.'});
   }
   else
   {
     return db.collection('employee').insert({
        //...
        })
        .then((employee) => {
           // Other stuff})
        })
   }
})
.catch((error) => {
    console.log(error)
    res.send({ status: 0, message: 'Something went wrong.' });
});

Или вы можете просто разветвлять свое обещание, связывая его с различными вызовами onSuccess.Одна ветка решит, отправлять сообщение или нет.Поскольку обещания связаны друг с другом, единственный способ - передать состояние по всей цепочке обещаний, как в другой ветви.

let exists = db.collection('employee')
    .find({
        email: data.email
     })
    .toArray()

 exists.then((checkEmail)=>{
    if(checkEmail.length > 0){
       return res.send({ status: 0, message: 'Employee already exist.'});
       //ends the excution here
    }
 })
 exists.then((checkEmail)=>{
      return checkEmail.length === 0;
   }
 })
 .then((createUser) => {
   if(createUser){
     return db.collection('employee').insert({
        //...
    })
    else
     return createUser
   }
 })
 .then((createUser)=> {
   if(createUser) {
     // Other stuff
   }
 })
 .catch((err)=>{
    console.log(error)
    res.send({ status: 0, message: 'Something went wrong.' });
 })
0 голосов
/ 01 октября 2018

Создание нового обещания в вашем выражении возврата не требуется, вы можете вернуть саму цепочку, если вам нужен метод для создания обещания.
Возврат из then в цепочке обещаний не останавливает цепочку, она просто проходитвозвращаемое значение в качестве аргумента для следующего then.Один из способов обойти это - сбросить собственную ошибку и правильно обработать ее в catch.Что-то вроде этого должно работать:

return db
  .collection("employee")
  .find({email: data.email})
  .toArray()
  .then(checkEmail => {
    if (checkEmail.length > 0) {
      let err = new Error("Employee already exists.");
      err.code = "EMPLOYEE_ALREADY_EXISTS";
      throw err;
    }
  })
  .then(() => {
    // Add employee details into collection as a new employee.
    return db.collection("employee").insert({
      //...
    });
  })
  .then(employee => {
    // Other stuff
  })
  .catch(error => {
    if (error.code && error.code === "EMPLOYEE_ALREADY_EXISTS") {
      res.send({ status: 0, message: "Employee already exists." });
    } else {
      console.log(error);
      res.send({ status: 0, message: "Something went wrong." });
    }
  });

edit: просто чтобы еще раз понять, что сотрудник в третьем then будет тем, что вы вернете из предыдущего then, то есть тем, что вернет db.collection("employee").insert({...}).

...