函数返回未定义而不是承诺中的整数?

问题描述

我创建了一个验证器来验证向下流数据到服务器并检查数据是否存在于数据库

model.js

const mongoose = require('mongoose');
const User = new mongoose.Schema({
    email:{
        type:String,unique:true,required:true,},password:{
        type:String,}
},{timestamps:true});

module.exports = mongoose.model('bbusers',User);

一个验证器

const joi = require('joi');
const User = require('./model');

const usermodel = joi.object({
    email:joi.string().email(),password:joi.string().min(5)
});

module.exports = (res) => {
    const {error,value} = usermodel.validate(res);
    if(error){
        return error;
    }else{
        User.countDocuments({email:res.email}).then(count => {
            if(count > 0){
                return 1;
            }else{
                return 0;
            }
        });
    }
}

最后一个用于调用函数的路由器

const router = require('express').Router();
const UserV = require('./UserV');
    
router.get('/register',async(req,res) => {
       console.log(UserV(req.body))
});

.. 当我使用非结构化电子邮件值进行查询时,我收到了一个例外的错误,但是每当我制作结构化电子邮件以检查电子邮件是否存在于数据库中而不是获取 1 或 0 时,我获取未定义

卷曲----

curl --location --request GET 'localhost:3000/register' \
--header 'Content-Type: application/json' \
--data-raw '{
    "email":"guptaanish450gmail.com","password":"adfdsdff"
}'

解决方法

问题出在验证器上。 如果你仔细观察,它会是这样的,

module.exports = (res) => {
    const {error,value} = UserModel.validate(res);
    if(error){
        return error;
    }else{
        User.countDocuments({email:res.email}).then(count => {
            if(count > 0){
                return 1;
            }else{
                return 0;
            }
        });
    }
    return; // The invisible return 
}

当没有错误时,您将得到的是隐形返回的undefined。在 promise 被解决的时候,你的函数已经完成了它的执行。

让验证器在任何一种情况下都返回一个承诺并从路由器处理它。

const router = require('express').Router();
const UserV = require('./UserV');
    
router.get('/register',async(req,res) => {
      try {
          const count = await UserV(req.body);
          console.log(count);
       catch(error) {
           console.log(error); // error case is here
       }       
});

并具有类似于,

const joi = require('joi');
const User = require('./model');

const UserModel = joi.object({
    email:joi.string().email(),password:joi.string().min(5)
});

module.exports = (res) => {
    const {error,value} = UserModel.validate(res);
    if(error){
        return Promise.reject(error);
    }else{
        return User.countDocuments({email:res.email}).then(count => {
            if(count > 0){
                return 1;
            }else{
                return 0;
            }
        });
    }
}