【问题标题】:mongoose async functions return undefined猫鼬异步函数返回未定义
【发布时间】:2018-04-08 04:08:40
【问题描述】:

我在处理从诸如 findOne(作为示例)等异步函数返回的数据时遇到了麻烦,我似乎无法正确处理。

在此代码中,正在创建 new_user,我想处理 findOne 函数的响应,但由于异步运行,用户为 Null。我尝试了不同的方法,但我无法理解它。

var router = require('express').Router();
var mongoose = require('mongoose');
var user = require('../../Schemas/user');

router.get('/a', function (req, res, next) {
    var new_user = new user({
        "user_name": req.query.username, "first_name": req.query.firstname,
        "last_name": req.query.lastname,
        "email": req.query.email, "trips": []
    });

    user.findOne({ email: new_user.email }).exec(function (user) {
        if (!user) { return res.sendStatus(401); }
        else
            return res.send(user);
    });
});

module.exports = router;

我会假设这是同一件事,但我也尝试将查找代码放在另一个页面中并从 router.get('/a') 中调用它,但最终遇到了同样的问题。

api/user.js:

new_user.checkUser(new_user.email).exec(function (user) {
    if (!user) {
        return res.sendStatus(401);
    }
    else
        return res.send(user);
})

用户架构:

var mongoose = require('mongoose');
var userSchema = new mongoose.Schema({
    id: Number,
    user_name: String,
    first_name: String,
    last_name: String,
    email: { type: String, unique: true },
    trips: [{ id: { type: Number } }]
},
{ collection: 'users' });

userSchema.methods.checkUser = function (newUser) {
    return userM.findOne({ email: newUser }).exec(function (err, doc) {
        return doc; //doc contains the document for sure
    });
};

var userM = mongoose.model('user', userSchema);

module.exports = userM;

我知道这很简单,但现在一切都变得模糊了。我将不胜感激。

【问题讨论】:

  • 有什么办法可以使用回调函数吗?
  • @prabhatmishra 虽然 Renato Gama 回答了这个问题,但我希望有任何改进建议。谢谢

标签: node.js mongodb mongoose


【解决方案1】:

.exec函数以(err, results)的形式返回,所以你应该把它改成:

user.findOne({ email: new_user.email }).exec(function (err, user) {
  if (err) {
    return next(err);
  }

  if (!user) {
    return res.sendStatus(401); 
  }

  res.send(user);
});

编辑: checkUser 调用 findOne 这是一个异步函数,因此您应该使用 async/await 语法 (1) 或传递回调 (2);

// 1
userSchema.statics.checkUser = function (newUser, cb) {
    return userM.findOne({ email: newUser }).exec(cb);
};

// 2
userSchema.statics.checkUser = async function (newUser) {
    return userM.findOne({ email: newUser });
};

所以你可以像下面这样消费它;

// 1
router.get('/a', function (req, res, next) {
    var new_user = new user({
        "user_name": req.query.username, "first_name": req.query.firstname,
        "last_name": req.query.lastname,
        "email": req.query.email, "trips": []
    });

    user.checkUser(new_user, function (err, user) {
        if (err) {
          return next(err)
        }

        if (!user) { return res.sendStatus(401); }
        else
            return res.send(user);
    });
});

// 2
router.get('/a', function (req, res, next) {
    var new_user = new user({
        "user_name": req.query.username, "first_name": req.query.firstname,
        "last_name": req.query.lastname,
        "email": req.query.email, "trips": []
    });

    try {
      const user = user.checkUser(new_user)
      if (!user) { return res.sendStatus(401); }
      else
          return res.send(user);
    } catch (err) {
      next(err)
    }
});    

【讨论】:

  • 你能解释一下我将如何从 userSchema.methods.checkUser 返回文档并使用 api/user.js 中的响应吗?
猜你喜欢
  • 2016-04-03
  • 2021-04-20
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
相关资源
最近更新 更多