MEAN 2多租户(多个集合保存相互参考)

所以,虽然学习JS,特别是MEAN 2堆栈,我试图build立一个基本的多租户应用程序。 我build立快速注册路线,我试图达到的stream量将是:

注册公司名称,电子邮件和密码。 信息会去保存一个新的租户,然后返回新租户的_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; 

我得到一个错误:无法设置标题发送后。 我想我知道我错了,返回租户信息。 我认为asynchronous是答案,但不知道如何实现它。 对不起,如果这是一个愚蠢的问题,或者我错过了一些明显的东西,我是超新的,callback正在做我的头。

发生这种情况是因为res.status()一旦触发就设置标题。 尝试在检查错误时多次执行此操作,然后尝试在Tenant.findById()再次设置状态码。

你最终的stream程如下:

 if (err) set headers set headers (again) findById() if (err) set headers set headers (again) 

在写出你的回答时,你必须小心,你只在逻辑stream程的最后一点做到这一点。 你也可以设置一个全局的err处理程序并throw new Error()并停止逻辑stream程立即处理输出。 如果不这样做,即使遇到错误,代码也会继续执行。

另一个提示:callback不能很好的回报。 虽然你可以安排他们工作,或者实现一个承诺架构,但最简单的修复(也是最容易学习的)是让你的函数全部是asynchronous的。

试试像这样:

 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) }); 

…为其余的任务创build额外的独立函数(甚至模块),然后你可以像这样调用你的函数:

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