2017-08-24 78 views
1

我一直在研究一個允許我將公司添加到數據庫的應用程序。原來我的代碼是純意大利麪條,所以我想正確模塊化。爲此,我添加了路線,控制器和道路。回調,錯誤捕獲和MongoDB的問題

這是我的代碼看起來現在

路線

app.post('/loadcompanies', (req, res)=> { 
    companiesController.loadcompany(req.body, (results)=>{ 
     console.log(results); 
     res.send(200, "working!"); 
    }) 
    }) 

控制器

module.exports.loadCompany = (body, callback)=>{ 
    companiesDao.loadCompany(body, callback); 
} 

module.exports.loadCompany = (company, callback)=>{ 
MongoClient.connect(conexionString, (err, database) => { 
    if (err) console.log(err); 
    db = database; 
    console.log(company); 
    db.collection('companies').insert(company, (err, result)=>{ 
     callback({message:"Succesfully loaded company", company:result});  
    }); 
    }) 
} 

我目前的擔心是,像這樣模塊化時發生錯誤是令人困惑的。我試着在db插入的時候添加一個try-catch方法,如果有的話會拋出錯誤,但這似乎不起作用。其他的事情我已經試過在回調返回錯誤,像這樣:

if (err) callback (err, null); 

,但我最終得到「無法設置頭髮送之後。」錯誤。

你會如何處理這種情況下的錯誤?例如,在有人試圖在唯一元素中添加重複條目的情況下。

+0

回調和錯誤檢查一直是棘手的,我會建議你看看使用承諾,然後研究異步/等待,使事情變得更好。 – Keith

+0

作爲一個附錄,在我原來的意大利麪條應用程序中,我剛剛發送了一個503,當mongodb發生了錯誤,那就是 – xai2

+0

我會看看承諾和異步等待肯定,因爲回調可以真正混淆哈哈,但這些案例的例子似乎主要是回調。 謝謝! – xai2

回答

1

你應該能夠簡單地做錯誤的回調插入函數內部檢查:

db.collection('companies').insert(company, (err, result)=>{ 
    if (err) { 
     callback(err, null); 
     return; 
    } 
    callback(null, {message:"Succesfully loaded company", company:result});  
}); 

如果像你說得到一個錯誤,這可能是因爲該數據庫實際上是返回一個錯誤。您也可以使您的錯誤更具體,如:

module.exports.loadCompany = (company, callback)=>{ 
MongoClient.connect(conexionString, (err, database) => { 
    if (err) { 
     callback(new Error('Connection error: ' + err.Error()); 
     return; 
    } 
    db = database; 
    console.log(company); 
    db.collection('companies').insert(company, (err, result)=>{ 
     if (err) { 
      callback(new Error('Insertion error: ' + err.Error()); 
      return; 
     } 
     callback(null, {message:"Succesfully loaded company", company:result});  
    }); 
}) 
+0

只需要注意,你要麼執行'if(err){} else {},'或者'if(err)return callback()',因爲在這段代碼中將會發生錯誤回調,然後執行成功的回調。 – Keith

+0

@Keith當然,愚蠢的錯誤。謝謝 –

+0

沒問題,很容易做到。我發現另一件事,因爲你的成功回調不會忘記把'callback(null,result)'..這些東西讓我在看到這些時立即轉換成承諾,然後使用async/await。說即使使用異步/等待我有時可以忘記等待.. – Keith

0

這是您的loadCompany以異步/等待格式完成。

通知不需要進行錯誤檢查,錯誤將按照預期在承諾鏈上傳播。

注意,我也改變loadCompany是一個異步功能太多,所以調用它,你可以簡單地做var ret = await loadCompany(conpanyInfo)

module.exports.loadCompany = async (company)=>{ 
 
    let db = await MongoClient.connect(conexionString); 
 
    console.log(company); 
 
    let result = await db.collection('companies').insert(company); 
 
    return {message:"Succesfully loaded company", company:result};  
 
}

+0

非常感謝:)我已閱讀承諾的優勢,我絕對會開始在我的代碼中使用它們。 這個方法的調用需要通過一個承諾,等待,對吧?從控制器和路線 – xai2