麻烦callback,错误捕获和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}); }); }) } 

我目前的担心是,模块化这样的错误工作是令人困惑的。 我试图添加一个try-catch的方法,如果有一个db插入和抛出和错误,但似乎并没有工作。 我试过的其他事情是在callback中返回错误,如下所示:

 if (err) callback (err, null); 

但我最终得到一个“发送后无法设置标题”。 错误。

你将如何处理在这种情况下的错误? 例如,在有人试图在唯一元素中添加重复条目的情况下。

您应该能够简单地在插入函数的callback中进行错误检查:

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

这是你的loadCompany以asynchronous/等待格式完成的。

通知没有必要进行错误检查,错误将按预期传播到承诺链。

注意我也改变了loadCompany作为一个asynchronous函数,所以要调用它你可以简单地做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}; }