2017-08-24 10 views
1

私はデータベースに会社を追加できるアプリケーションを開発しています。もともと私のコードは純粋なスパゲッティなので、適切にモジュール化したかったのです。この目的のために、ルート、コントローラー、DAOを追加しました。コールバック、エラーキャッチ、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挿入とthrowingとエラーがある場合はtry-catchメソッドを追加しようとしましたが、うまくいかないようです。私が試した他のものは、このように、コールバックでエラーを返して:

if (err) callback (err, null); 

が、私は「彼らが送られた後、ヘッダーを設定することはできません。」になってしまいますエラー。

どのようにこの状況でエラーを処理しますか?たとえば、ある人が一意の要素に重複エントリを追加しようとした場合などです。あなたが言うように、あなたがエラーを取得する場合は、データベースが実際にエラーを返しているので

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

、それはおそらくです:

+0

コールバックやエラーチェックは、常に私は、トリッキーうしている行うことができますので、それを呼び出すために、あまりにも非同期機能するloadCompanyをも変更しました

注意約束を使って調べることを提案してから、より良いものを作るためにasync/awaitを調べます。 – Keith

+0

補足として、私の元のスパゲッティアプリケーションでは、mongodbにエラーがあったときにresを503送ると、そのことが – xai2

+0

コールバックが本当に混乱する可能性があるので、私は約束を見て非同期を待っていますこれらのケースの例はほとんどがコールバックであるようです。 ありがとう! – xai2

答えて

1

あなたはinsert関数のコールバック内でエラーチェックを行うだけですることができるはずです。

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を使うようにするものです。 asyncを使っていると言っても、待つことを忘れることもあります。 – Keith

0

ここでは、loadCompanyはasync/await形式で行われます。

注意エラーチェックの必要はありません。予想通りにエラーが伝播します。私はあなたが単に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

関連する問題