Node.js 平均2个多租户(多个相互引用的集合存储)
因此,在学习JS,特别是MEAN 2 stack的同时,我正在尝试构建一个基本的多租户应用程序。我正在快速建立注册路线,我试图实现的流程是: 使用公司名称、电子邮件和密码注册。该信息将用于保存新租户,然后返回新租户的_id,然后使用此新id、电子邮件和密码保存新用户 最接近的是: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
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()
});
});
非常感谢你写的这么好的答案,我现在真的理解了一些东西,哈哈。我也通过这个新的见解实现了我想要的。赢