2017-08-27 46 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; 

我得到一個錯誤:他們已經被送往着套頭後。 我想我知道我錯在哪裏,並返回租戶信息。我認爲異步是答案,但不知道如何實現它。對不起,如果這是一個愚蠢的問題,或者我錯過了一些顯而易見的東西,我對此很感興趣,而且回調函數正在做我的頭。

回答

0

這是因爲res.status()一旦觸發就設置標題。嘗試在檢查錯誤時多次執行此操作,然後嘗試再次在Tenant.findById()中設置狀態碼。

你最終像一個流程:

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

你必須寫出你的迴應,你只能做它在你的邏輯流程的最後一個點的時候要小心。您也可以可以建立一個全球性的ERR處理器和throw new Error(),並停止邏輯的流量和立即處理的輸出。如果不這樣做,即使遇到錯誤,代碼也會繼續執行。

另一個祕訣:回調不回報很好地工作。儘管你可以安排他們工作,或者實現承諾架構,但最簡單的解決方案(也是最容易學習的)是讓你的函數全部是異步的。

嘗試,而不是像這樣:

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