2017-08-11 8 views
0

これはノードエクスプレスのコードで、SQLトランザクションが正常に完了すると電子メールを送信します!ノードコールバック - コードが動作しない

router.post('/',function(req,res,next){ 
    sql.connect(config).then(function() { 
     var request = new sql.Request(); 
     request.query(`update projects set CIP_NCIP= '${req.body.cip_noncip}' , Capital_Expense ='${req.body.capital_expensed}' , Approval_Status ='Approved' where Project_ID ='${req.body.projid}'`).then(function(recordset) { 
      console.log('Recordset: ' + recordset); 
      console.log('Affected: ' + request.rowsAffected); 
     }).catch(function(err) { 
      if(err) { 
       console.log('Request error: ' + err); 
      } 
     }) 
    }).then(
     transporter.sendMail(mailOptions, function(error, info){ 
      if (error) { 
       console.log(error); 
      } else { 
       console.log('Email sent: ' + info.response); 
      } 
     })).catch(function(err) { 
     if (err) { 
      console.log('SQL Connection Error: ' + err); 
     } 

    }); 
}); 

SQLのINSERTが動作しているようですが、そのコールバックとES5にかなり新しいコード

transporter.sendMail(mailOptions, function(error, info){ 
       if (error) { 
        console.log(error); 
       } else { 
        console.log('Email sent: ' + info.response); 
       } 
      }) 

のこのビットを実行していません。提案は、あなたが.thenメソッドを介して結合するための機能を実行することにより、

return request.query(`update projects set CIP_NCIP= '${req.body.cip_noncip}' , Capital_Expense ='${req.body.capital_expensed}' , Approval_Status ='Approved' where Project_ID ='${req.body.projid}'`).then(function(recordset) { 
      console.log('Recordset: ' + recordset); 
      console.log('Affected: ' + request.rowsAffected); 
     }).catch(function(err) { 
      if(err) { 
       console.log('Request error: ' + err); 
      } 
     }) 
+0

私は見ることができますが、限り、コードが実行されるように、それが動作するはずliktに見える問題のカップル - あなたは 'sendmailのを移動した場合'' request.query'のコールバックを呼び出すと、そこでは正常に動作しますか? 'mailOptions'はどこから来ましたか?コード内に、これが存在し、正しく構成されていると想定していないことを確認してください。 – James

+0

これはjsファイル全体です。https://www.itextpad.com/nXB8DStC2s – SSS

+0

でも、request.queryのコールバックのconsole.log( 'test')はうまく動作しません。 – SSS

答えて

2

あなたの現在のコードに基づいて、実際に正しい順序で問題を解決しているわけではありません(これは問題の可能性があります)。このお試しください:上記の

var request = sql.Request(); 
sql.connect(config) 
    .then(function() { 
     console.log('UPDATING RECORD...'); 
     return request.query(`update projects set CIP_NCIP= '${req.body.cip_noncip}' , Capital_Expense ='${req.body.capital_expensed}' , Approval_Status ='Approved' where Project_ID ='${req.body.projid}'`); 
    }) 
    .catch(function(err) { 
     if (err) { 
      console.log(`SQL Connection Error: ${err}`); 
     } 
    }) 
    .then(function(recordset) { 
     console.log('Recordset: ' + recordset); 
     console.log('Affected: ' + request.rowsAffected); 
     console.log('SENDING EMAIL...'); 
     return transporter.sendMail(mailOptions); 
    }) 
    .catch(function(err) { 
     if (err) { 
      console.log(`Nodemailer Err: ${err}`); 
     } 
    }) 
    .then(function() { 
     console.log('COMPLETE'); 
    });   
    console.log('CONNECTING...'); 

を最大限に約束を活用して、問題がどこにある絞り込む助けるべきいくつかのログが含まれています。ここ

FWIWは、それが(デバッグログなし)ES6でどのように見えるかだ

sql.connect(config) 
    .then(() => sql.Request().query('...')) 
    .catch(err => console.error(`SQL Error ${err}`)) 
    .then(() => transporter.sendMail(mailOptions)) 
    .catch(err => console.error(`Nodemailer err: ${err}`); 
+0

これを実装することができます! – SSS

+0

@SSS cool、あなたはES6にアップデートすることを検討すべきです、あなたのコードはもっと簡潔になります(例で私の答えを更新しました)。 – James

+0

私はする必要があります。興味深いチュートリアルをお勧めしますか? – SSS

0

が見え歓迎します。あなたが持っているあなたの場合

sql.connect(config) 
    .then(function() { ... }) 
    .then(valueNotAFunction); 

thenで実行される関数の戻り値は約束そのものである場合には、次のブロックが前の仕上げを待つことになるが。

コードブロック:

transporter.sendMail(mailOptions, function(error, info){ 
    if (error) { 
     console.log(error); 
    } else { 
     console.log('Email sent: ' + info.response); 
    } 
})) 

は、チェーン内の前の機能が終了していない後、直ちに実行されます。

また、request.queryはプロミスと評価され、あなたはチェーンに戻っていません。 transporter.sendMailを約束するので、あなたがsome promisification libraryでそれをラップすることがあります評価されない場合がありますことを心に留めておいてください

sql.connect(config) 
    .then(function() { .... ; return request.query(...) }) 
    .then(function() { .... ; return transporter.sendMail(....) }) 
    .catch(function(error) { console.error(error); }); 

あなたのコードは次のようになります。

+0

あなたはチェーンに戻るという約束を返すことはありません。 – James

2

約束は約束チェーンを次のAS-約束を返すのを忘れよう

+0

だから私はこれにも気付きましたが、なぜコードが実行されないのか説明していません。何かがあれば、DB更新前にメールが送信されることを意味します。 – James

+0

おそらく 'トランスポーター。sendMail'は接続が初期化されているので、すぐにメールを送信しないのです。 'transporter.sendMail'が何をしているのか分からずに、何が起こっているのかを推測する方法はありません。 – drinchev

+1

コードに基づいて、私の推測では、OPは[promiciseを返す] [nodemailer](https://nodemailer.com/about/)を使用しています。しかし、私はOPがコールバックを提供していることに気がついたので、彼らの場合はそうではありません。 – James

関連する問題