如何在Mongoose函数的if/else块中跳转复用已有逻辑?
解决重复代码问题:统一处理用户逻辑
嘿,这问题太常见了——谁都不想复制粘贴相同的代码块,咱们完全可以把重复执行的逻辑抽成独立函数,不管用户存在与否,都能复用这段逻辑,代码也会整洁很多!
具体方案:提取复用函数
你只需要把原来if(doc)块里的逻辑单独拎出来,写成一个独立函数(比如叫handleUserLogic),然后在两个分支里按需调用:如果用户存在直接调用,不存在就先创建保存用户,再调用这个函数。
修改后的代码示例
// 把需要复用的逻辑提取成独立函数 const handleUserLogic = (userDoc) => { console.log(userDoc.name); // 这里可以放所有需要重复执行的逻辑,比如更新用户数据、发送通知等 }; User.findById(msg.chat.id) .then((doc) => { if (doc) { // 用户已存在,直接执行复用逻辑 handleUserLogic(doc); } else { console.log('Empty'); // 用户不存在,先创建并保存新用户 const newUser = new User({ _id: msg.chat.id, name: msg.chat.first_name // 示例字段,根据你的业务需求调整 // 补充其他必要的用户字段 }); // 返回保存操作的Promise,衔接后续逻辑 return newUser.save(); } }) .then((savedUser) => { // 如果是从else分支过来的,savedUser就是刚保存的用户文档 if (savedUser) { handleUserLogic(savedUser); } }) .catch((err) => { console.log(err); });
这么做的好处
- 彻底避免代码复制粘贴,后续修改业务逻辑只需要改动
handleUserLogic这一个地方,维护成本大幅降低 - 代码结构更清晰:分支判断逻辑和核心业务逻辑分离,可读性更强
- 利用Promise链式调用的特性,在保存用户后自然衔接后续操作,不用嵌套多层回调,代码更扁平化
如果你的User模型创建用户时有特殊需求(比如默认值、字段校验),只需要调整new User()部分的配置即可,核心的复用逻辑完全不受影响~
内容的提问来源于stack exchange,提问作者Saeed Heidarizarei
相关产品推荐
相关产品推荐

