【问题标题】:Mongoose findOneAndUpdate return Custom ObjectMongoose findOneAndUpdate 返回自定义对象
【发布时间】:2018-12-18 00:38:08
【问题描述】:

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

结构如下所示

user.service.js

user.controller.js

Service 将从Controller 中调用,在Service 内部,mongoose findOneAndUpdate 将被调用。

现在,我想在更新后从 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;
});
}

user.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

有什么想法吗?

【问题讨论】:

    标签: node.js mongoose async-await


    【解决方案1】:

    更改您的 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;
      }
    }
    

    【讨论】:

    • 这里的结果变量包含User 对象,我使用的对象是Result 对象
    • 好的。我只是按照您的意愿进行了编辑。我只是展示了上次的方式
    【解决方案2】:
    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)
      });
    }
    

    在您处理错误情况时没有拒绝。此外,如果您想使用拒绝来查看遇到了什么错误,请在函数范围内创建一个新变量并在 catch 内设置为 err。

    【讨论】:

    • 你如何在Promise里面得到if (err)?!
    猜你喜欢
    • 2020-05-20
    • 2019-07-12
    • 2019-07-10
    • 2016-01-26
    • 1970-01-01
    • 2019-04-15
    • 2019-05-01
    • 2021-01-02
    • 2013-09-18
    相关资源
    最近更新 更多