【问题标题】:findOneAndUpdate, Callback must be a function, got [object Object] , NodeJs, mongoose errorfindOneAndUpdate, Callback 必须是一个函数,得到 [object Object] , NodeJs, mongoose 错误
【发布时间】:2021-05-27 21:41:49
【问题描述】:

我正在 MERN 堆栈中开发一个 webapp,在这样做时遇到了错误,请帮助。当我尝试更新用户时,它给了我一个错误,回调必须是一个函数,得到'[object Object]'。

这是 API。

保证用户始终存在。

module.exports.addBlog=(req,res)=>{
    const {title,data} = req.body.blog;
    console.log(title,data);
    const {email} = req.body;
    const newblog ={
        title,
        data
    }
    userSchema.findOneAndUpdate(
        {email},
        {$push:{blogArray:newblog}},
        {upsert:true},
        {useFindAndModify:false}
        )
        .then(res=>console.log(res))
        .catch(err=>console.log(err));
   
    return res.json({msg:"Blog added successfully"});
}

这是用户模式。

const userSchema = new mongoose.Schema({
    firstname:{
        type:String,
        required:true,
        lowercase:true
    },
    lastname:{
        type:String,
        required:true,
        lowercase:true
    },
    email:{
        type:String,
        required:true,
        lowercase:true
    },
    password:{
        type:String,
        required:true
    },
   blogArray:[
       {
        title:{
            type:String,
             required:true
        },
        data:{
            type:String,
            required:true
        }
    }
   ]
});

【问题讨论】:

  • 您将四个单独的对象传递给 findOneAndUpdate,我认为这不是您想要的。

标签: node.js mongodb mongoose


【解决方案1】:

findOneAndUpdate 有 3 个可能的签名:

    findOneAndUpdate(
        filter: FilterQuery<TSchema>,
        update: UpdateQuery<TSchema> | TSchema,
        callback: MongoCallback<FindAndModifyWriteOpResultObject<TSchema>>,
    ): void;
    findOneAndUpdate(
        filter: FilterQuery<TSchema>,
        update: UpdateQuery<TSchema> | TSchema,
        options?: FindOneAndUpdateOption<TSchema>,
    ): Promise<FindAndModifyWriteOpResultObject<TSchema>>;
 findOneAndUpdate(
        filter: FilterQuery<TSchema>,
        update: UpdateQuery<TSchema> | TSchema,
        options: FindOneAndUpdateOption<TSchema>,
        callback: MongoCallback<FindAndModifyWriteOpResultObject<TSchema>>,
    ): void;

您正在尝试使用签名 #2,即使用承诺的签名,因此您需要将语法更改为:

userSchema.findOneAndUpdate(
        {email},
        {$push:{blogArray:newblog}},
        {upsert:true, useFindAndModify:false},
        )
        .then(res=>console.log(res))
        .catch(err=>console.log(err));

查看所有 Mongos nodejs 类型here

【讨论】:

    猜你喜欢
    • 2018-03-28
    • 2020-06-29
    • 2023-01-10
    • 1970-01-01
    • 2017-01-22
    • 2021-03-31
    • 2020-09-25
    • 1970-01-01
    • 2020-12-20
    相关资源
    最近更新 更多