代码之家  ›  专栏  ›  技术社区  ›  Hary

mongoose findoneandupdate返回自定义对象

  •  0
  • Hary  · 技术社区  · 6 年前

    我已经在node.js项目中定义了分层。

    结构如下

    用户服务

    用户控制器.js

    Service 将从以下位置调用 Controller 在里面 服务 , mongoose findOneAndUpdate 将被调用。

    现在,我要从返回自定义对象 服务 在更新之后,但是 result 对象在中始终未定义 控制器

    用户服务.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;
    });
    }
    

    用户控制器.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 回复  |  直到 6 年前
        1
  •  1
  •   krbalaji    6 年前

    像这样更改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;
      }
    }
    
        2
  •  1
  •   pr0p    6 年前
    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 inside catch。