Node.js 平均2个多租户(多个相互引用的集合存储)

Node.js 平均2个多租户(多个相互引用的集合存储),node.js,express,mongoose,multi-tenant,async.js,Node.js,Express,Mongoose,Multi Tenant,Async.js,因此,在学习JS,特别是MEAN 2 stack的同时,我正在尝试构建一个基本的多租户应用程序。我正在快速建立注册路线,我试图实现的流程是: 使用公司名称、电子邮件和密码注册。该信息将用于保存新租户,然后返回新租户的_id,然后使用此新id、电子邮件和密码保存新用户 最接近的是: router.post('/', function (req, res, next) { var tenant = new Tenant({ name: req.body.name }); var

因此,在学习JS,特别是MEAN 2 stack的同时,我正在尝试构建一个基本的多租户应用程序。我正在快速建立注册路线,我试图实现的流程是:

使用公司名称、电子邮件和密码注册。该信息将用于保存新租户,然后返回新租户的_id,然后使用此新id、电子邮件和密码保存新用户

最接近的是:

router.post('/', function (req, res, next) {

  var tenant = new Tenant({
    name: req.body.name
  });
  var newTenant;

  tenant.save(function (err, tenant) {
    if (err) {
      return res.status(500).json({
        title: 'An error has occured',
        error: err
      });
    }
    res.status(201).json({
      message: 'Tenant created',
      obj: tenant
    });
    return(tenant._id);
    newTenant = tenant;
  });

  Tenant.findById(newTenant._id, function(err, tenant) {
    if (err) {
      return res.status(500).json({
        title:'An error occured',
        error: err
      });
    }
    var user = new User({
      email: req.body.email,
      password: bcrypt.hashSync(req.body.password, 10),
      active: req.body.active,
      tenant: tenant
    });
    user.save(function (err, user) {
      if (err) {
        return res.status(500).json({
          title: 'An error has occured',
          error: err
        });
      }
      res.status(201).json({
        message: 'User created',
        obj: user
      });
    });
  });

});

module.exports = router;
我收到一个错误:发送标题后无法设置标题。
我想我知道我错在哪里了,返回租户信息。我认为Async是答案,但我不知道如何实现它。很抱歉,如果这是一个愚蠢的问题,或者我遗漏了一些明显的东西,我对这一点非常陌生,回调正在进行中。

之所以发生这种情况,是因为
res.status()
在启动后立即设置头。您在检查错误时尝试多次执行此操作,然后在
Tenant.findById()
中再次尝试设置状态代码

最终会出现如下流:

if (err) set headers
set headers (again)
findById()
if (err) set headers
set headers (again)
在写下你的回答时你必须小心,你只能在逻辑流程的最后一点做。您还可以设置全局错误处理程序并
抛出新错误()
,停止逻辑流并立即处理输出。如果不这样做,代码将继续执行,即使它遇到错误

另一个提示:回调不能很好地处理返回。尽管您可以安排它们工作,或者实现promise体系结构,但最简单的修复方法(也是最容易学习的方法)是使您的函数都是异步的

尝试以下方法:

tenant.save(function (err, tenant, callback) {
  // add a callback param to your fn ^
  if (err) {
    throw({
      code: 500,
      title: 'An error has occured',
      error: err
    });
  } else {
  // ^ add an else statement so you don't set the headers twice 
  // (because res.status() sets headers)
    res.status(201).json({
      message: 'Tenant created',
      obj: tenant
    });
  }
  callback(err, tenant);
  // call your async function instead of return, 
  // and pass both err and tenant as params
  // (one or the other may be undefined though, if it fails/succeeds)
});
。。。为其余任务创建额外的独立函数(甚至模块),然后您可以这样调用您的函数:

tenant.save(function(err, tenant) {
  Tenant.findById(tenant._id, function(err, tenant) {
    var user = new User({...})
    user.save()
  });
});

非常感谢你写的这么好的答案,我现在真的理解了一些东西,哈哈。我也通过这个新的见解实现了我想要的。赢