findOneAndUpdate,回调必须是函数,得到[object对象],NodeJs,mongoose错误

6vl6ewon  于 2023-01-21  发布在  Go
关注(0)|答案(2)|浏览(102)

我正在MERN堆栈中开发一个Web应用程序,在此过程中遇到错误,请帮助。当我尝试更新用户时,它给我一个错误,回调必须是函数,已获得“[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
        }
    }
   ]
});
omqzjyyz

omqzjyyz1#

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节点类型here

ne5o7dgx

ne5o7dgx2#

这是因为你需要把所有的"更新操作"放到第二个对象中。
复制错误:

findOneAndUpdate({id: mongoId}, {$inc: {total: 10}}, {$inc: {withdrawals: -10}}, {new: true})

结果:错误
固定:
将所有$INC操作移动到第二个参数对象中:

findOneAndUpdate({id: mongoId}, {$inc: {total: 10} $inc: {withdrawals: -10}}, {new: true})

结果:有效
基本上你的所有操作都必须作为第二个参数,并且都必须在一个对象中,如下所示:

{
 $inc: {total: 10},
 $inc: {withdrawals: -10}
}

不要使每个操作单独的对象,否则你会得到这个错误,即.

{
 $inc: {total: 10}
}, 
{
 $inc: {withdrawals: -10}
}

这里是我的频道上的视频,我告诉你如何修复它:https://youtu.be/nPC1OAGXGWM

相关问题