Mongoose findOneAndUpdate возвращает пользовательский объект - PullRequest
0 голосов
/ 17 декабря 2018

Я определил слои в проекте node.js.

Структура будет выглядеть примерно так:

user.service.js

user.controller.js

Service будет вызываться из Controller, а внутри Service будет вызываться mongoose findOneAndUpdate.

Теперь я хочу вернуть объект Custom.с Service после обновления, но объект result всегда неопределен в Controller

user.service.js

async function activate(tokenParam)
{

  await User.findOneAndUpdate(
   {
     activationToken: tokenParam
   }, 
   {
     $set:{isActive:true}
   }, 
   {
     new: true, 
     useFindAndModify: false
   })
  .exec()
  .then(function (err, doc) {

    var result = new Result();

    if (err)
    {
      result.hasData = false;
      result.exception = err
    }
    else
    {
      result.hasData = true;
      result.data = doc.isActive
    }

    console.log("User Service: Result: " + result)

    return result;
});
}

пользователя.controller.js

userService
.activate(req.params.token)
.then(result => {
  console.log("User Controller: Activate:" + result);

  if (result && result.hasData && result.data) {
    res.status(200).json(result); //Account Activated
  } else {
    res.status(401).json(result); //Account Not Activated
  }
})
.catch(err => next(err));

Ожидаемый вывод

//console.log("User Service: Result: " + result)
User Service: Result: { ... }

//console.log("User Controller: Activate:" +result)
User Controller: Activate: Result: { ... }

Фактический вывод

//console.log("User Service: Result: " + result)
User Service: Result: { ... }

//console.log("User Controller: Activate:" +result)
User Controller: Activate: undefined

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018
async function activate(tokenParam)
{
  var result = new Result();

  try{
      var doc = await User.findOneAndUpdate(
       {
         activationToken: tokenParam
       }, 
       {
         $set:{isActive:true}
       }, 
       {
         new: true, 
         useFindAndModify: false
       })
      result.hasData = true;
      result.data = doc.isActive

   }
   catch(err)
   {
      result.hasData = false;
      result.exception = err
   }

   console.log("User Service: Result: " + result)

   return new Promise((resolve, reject)=>{
         resolve(result)
  });
}

Нет отклонения, поскольку вы обрабатываете условие ошибки.Также, если вы хотите использовать reject, чтобы увидеть, какую ошибку вы получаете, создайте новую переменную внутри области действия функции и установите err в catch.

0 голосов
/ 17 декабря 2018

Измените свой user.service.js как.

async function activate(tokenParam)
{
  let result = new Result();
  try {

    const user =  await User.findOneAndUpdate({
                           activationToken: tokenParam
                         }, 
                         {
                           $set:{isActive:true}
                         }, 
                         {
                           new: true, 
                           useFindAndModify: false
                         })
     if(user) {
          result.hasData = true;
          result.data = doc.isActive
          return result;
     }
  } catch(err){
    result.hasData = false;
    result.exception = err;
    return result;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...