2017-08-27 12 views
2

JSを学びながら、具体的には平均2テナントのアプリケーションを構築しようとしています。私は高速でサインアップルートを構築し、私が達成しようとしている流れは次のようになります:平均2つのテナンシー(複数のコレクションセーブを互いに参照する)

企業名、メールアドレス、パスワードでサインアップしてください。情報は新しいテナントを保存し、新しいテナントの_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は答えだと思いますが、実装する方法を理解できません。残念ですが、これは愚かな質問であるか、私は何かが分かりませんが、私はこれに新しいスーパーでコールバックは私の頭の中でやっている。

答えて

0

これは起きるとすぐにres.status()ヘッダーを設定するためです。エラーをチェックするときとエラーを確認するときの両方でこれを何度もやろうとしたら、Tenant.findById()にステータスコードを再度設定しようとします。

あなたのような流れで終わる:あなたはあなただけの論理フローの最後の時点でそれを行うことをあなたの応答を書き出す際に注意する必要があり

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

。また、グローバルエラーハンドラとthrow new Error()を設定し、ロジックの流れを停止することもできますはすぐに出力を処理します。そうしないと、エラーが発生してもコードは実行され続けます。

もう1つのヒント:コールバックはリターンではうまく機能しません。そして、あなたがそれらを働かせるように手配したり、有望なアーキテクチャーを実装したりすることはできますが、最も簡単な修正(そして最も簡単な学習)は、すべての機能を非同期にすることです。そして、あなたは、このようなあなたの関数を呼び出すことができ、あなたのタスクの残りのための追加的な孤立機能(あるいはモジュール)を作成します...

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() 
    }); 
}); 
を代わりのようなものを試してみてください

+1

このよく書かれた答えのためにありがとう、私は今実際に何かを理解する笑。この新しい洞察力で私が望んでいたものを正確に達成することもできました。勝つ – Cheekumz

関連する問題