【问题标题】:calling a controller function with promise unable to await with then function调用带有 promise 的控制器函数无法使用 then 函数等待
【发布时间】:2020-12-04 12:46:21
【问题描述】:

如果在数据库中满足条件,我在控制器中有一个函数想要创建两个不同的模型。 API 被调用:

PUT localhost:3000/用户

调用 app.post('/user', user.create)

user.create 在控制器文件中:

const business = require("./controllers/business.controller.js");

exports.create = (req,res) => {

    const user = new User ({
    email: req.body.email
    uniqueAccount: req.body.unique
    })

    User.create (user, function(err,doc){
        if (err) res.status(500).send(err)
        if (user.uniqueAccount) {
            let result = business.create(req,res)
            console.log(result)
        }

        res.send(doc)
    })
}

在业务控制器中也是一样的功能:

exports.create = (req,res) => {
    const business = new Business({
        name: req.body.businessname
    })

    Business.create (business, function(err,doc){
        if (err) return err
        return doc
    }
}

因为我的行:

let result = business.create(req,res) 没有承诺等待,我无法看到业务控制器的返回。我尝试使用 .then 函数,但遇到了错误:

TypeError:无法读取未定义的属性“then”

我该如何正确处理这个问题?我可以将模型导入我的用户控制器,然后在用户控制器中创建业务模型,但我想分离目的。

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    只有当函数返回一个 promise 时,你才能在函数上使用 await,所以从你的业务控制器返回一个 promise,而不是返回一个简单的值。

    您可以承诺您的业务控制器功能,然后在您的 user.create 功能中使用 await。这样做:

         const business = require("./controllers/business.controller.js");
    
         exports.create = (req,res) => {
    
            const user = new User ({
            email: req.body.email
            uniqueAccount: req.body.unique
         })
    
         User.create (user, async function(err,doc){
           if (err) res.status(500).send(err)
           if (user.uniqueAccount) {
             let result = await business.create(req,res)
             console.log(result)
           }
    
           res.send(doc)
          })
        }
    

    现在承诺你的业务控制器功能。

          exports.create = (req,res) => {
            return new Promise((resolve,reject)=>{
              const business = new Business({
                name: req.body.businessname
              })
    
              Business.create (business, function(err,doc){
                 if (err) reject(err)
                 resolve(doc)
              }
            });
          }
    

    【讨论】:

      猜你喜欢
      • 2015-07-01
      • 2020-06-02
      • 2016-12-18
      • 1970-01-01
      • 2017-06-09
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多