回调,错误捕获和MongoDB的麻烦

时间:2017-08-24 22:22:35

标签: javascript node.js mongodb express

我一直致力于一个允许我将公司添加到数据库的应用程序。最初我的代码是纯意大利面条,所以我想正确地模块化它。为此,我添加了路线,控制器和dao。

这就是我的代码现在的样子

路线

  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方法,如果有一个则抛出和错误,但这似乎不起作用。我尝试过的其他事情是在回调中返回错误,如下所示:

if (err) callback (err, null);

但我最终收到了“发送后无法设置标头”。错误。

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

2 个答案:

答案 0 :(得分: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});    
    });
})  

答案 1 :(得分:0)

这是您的loadCompany以async / await格式完成的。

Notise不需要进行错误检查,错误将按预期传播到promise链上。

注意我也将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};    
}