You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NodeJS类与Mongoose时如何避免回调嵌套问题?

使用NodeJS和Mongoose的面向对象编程替代回调地狱

最近我在做NodeJS + Mongoose的面向对象开发,想摆脱回调地狱的困扰。我现在用的是下面这个类,注意看getMember()方法里我用了内部回调函数,我想知道怎么不用内部函数,直接把this.callBack正确绑定进去,就像我期望的实现效果这样:

getMember(req, res) { 
  var memberId = req.params.id; 
  Member.findById(memberId, this.callBack); 
}

我的类代码如下:

'use strict'; 
var mongoose = require('mongoose'), 
Member = mongoose.model('Members'); 

class Members { 
  constructor(router) { 
    this.router = router; 
    this.registerRoutes(); 
  } 

  callBack(err, task) { 
    if(err) res.send(err); 
    res.json(task); 
  } 

  registerRoutes() { 
    this.router.get('/members', this.list_all_members.bind(this)); 
    this.router.get('/members/:id', this.getMember.bind(this)); 
    this.router.post('/members', this.create_a_member.bind(this)); 
  } 

  getMember(req, res) { 
    var memberId = req.params.id; 
    Member.findById(memberId, function(err, task) { 
      if(err) res.send(err); 
      else res.json(task); 
    }); 
  } 
} 

module.exports = Members; 

解决方案:

后来我自己琢磨出了一个可行的方案:

我的构造函数改成这样:

constructor() { 
  this.callBack = (err, task, res) => { 
    if(err) res.send(err); 
    res.json(task); 
  } 
}

对应的Mongoose回调写法调整为:

select(req, res) { 
  // schemaDB is the mongoose schema. 
  schemaDB.find({}, (err, task) => { 
    this.callBack(err, task, res) 
  } ); 
}

内容的提问来源于stack exchange,提问作者JustDeveloper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:57:51