mongoose Model.create 函数返回未定义

Posted

技术标签:

【中文标题】mongoose Model.create 函数返回未定义【英文标题】:mongoose Model.create function returns undefined 【发布时间】:2020-01-18 04:07:30 【问题描述】:

当我尝试创建用户时,上述查询返回 200,但每当我登录 MongoDB 时,都没有创建任何集合。有人可以帮忙吗?

//用户模型


const userSchema = mongoose.Schema(
    name: 
        type : String, 
        required  : true,
        trim : true
    ,
    email: 
        type: String,
        required: true,
        unique: true,
        lowercase: true,
        validate: value => 
            if(!validator.isEmail(value))
                throw new Error(error : 'Invalid email address')
            
        
    ,
    password: 
        type: String, 
        required: true,
        minLength: 5
    ,
    // a user can have multiple jobs
    jobs : [
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Job'
    ],
    tokens: [
        token: 
            type: String,
            required:  true
        
    ]
)
const User = mongoose.model('User', userSchema)
module.exports = User

//编写的用户函数

  createUser(name, email, password)
        return User.create(name: name, email: email, password : password, (err, docs) => 
            if(err)
                throw err.message;
            

        );
    

//routes.js

// user create
router.post('/users', async(req, res) => 
    try
        const name, email, password  = req.body
        const user = userManager.createUser(name, email, password); [1]
        res.status(200).json(user)
    
    catch(error) 
        res.status(400).send(error : error.message)
    
)

line[1] 返回未定义。为什么 ? 注意:满足所有模块要求

【问题讨论】:

【参考方案1】:

问题是你同步调用了一个异步函数。它返回 undefined 因为该函数尚未解析。 一个解决方案可能是使用promises 或async/await

例子:

async createUser(name, email, password) 
    const createdUser = await User.create(name,email,password);
    return creaatedUser;

【讨论】:

【参考方案2】:

创建schema 后,您需要创建一个模型FROM 该架构。

来自MDN的示例:

// Define schema
var Schema = mongoose.Schema;

var SomeModelSchema = new Schema(
  a_string: String,
  a_date: Date
);

// Compile model from schema
var SomeModel = mongoose.model('SomeModel', SomeModelSchema );

现在创建模型后,您可以使用SomeModel.create

编辑line[1] 将始终返回 undefined 因为您正在使用 callbacks 并且从回调中获取价值的唯一方法是推送另一个回调(我真的不鼓励这样做)。但最好的方法是使用Promises 现在猫鼬默认支持`Promises.所以,基本上是为了承诺,

// user functions written

async function createUser(name, email, password)
  try 
    return await User.create( name: name, email: email, password: password );
   catch (err) 
    throw err.message;
  

在路由器中添加await:

const user = await userManager.createUser(name, email, password);

【讨论】:

我在问题中看不到这一点。您创建了架构,但没有创建模型。 那为什么返回 undefined ? 编辑了答案。请仔细阅读 node.js 中的异步函数。\

以上是关于mongoose Model.create 函数返回未定义的主要内容,如果未能解决你的问题,请参考以下文章

传递文档数组时,Mongoose 中 Model.create 的原子性

传递文档数组时,Mongoose 中 Model.create 的原子性

Mongoose.create + Q 将 mongoose 承诺转换为 Q 承诺

mongoose项目随笔

MongooseJS - 具有现有引用的Model.create

Mongoose:3 路文件加入