現在redmineのnoduモジュールである、node-redmineというものを使って、redmine上の情報を取得しているのですが、
正常に取得するときは返ってくるのが早いのか、同期的に処理できているのですが、エラーの場合に処理が遅く、結果を取得しないまま次の処理を実行してしまっているため、同期的にさせたいと考えています。
以下コードですが、同期的な処理を書いたことがないので、調べながら書いていますが、errorキャッチも、promiseのrejectも試したものの、nodeモジュールの実行結果が最後に来てしまいます。
js
1var Redmine = require('node-redemine'); 2const hostName = 'host名'; 3const config = { 4 aiKey: 'apikey'; 5} 6var redemine = new Redmine(hostName, config); 7... 8function getFromClient(req, res) { 9 10 var url_parts = url.parse(req.url); 11 switch (url_parts.pathname) { 12 ... 13 略 14 ... 15 case '/complete': 16 var data = ''; 17 var jsonData; 18 req.on('readable', function (chunk) { 19 data += req.read() || ''; 20 }); 21 req.on('end', async function () { 22 jsonData = qs.parse(data); 23 console.log('最初'); 24 console.log('qs.parse jsonData'); 25 console.log(jsonData); 26 var result; 27 await createUser(jsonData).then((lastData) => { 28 result = lastData; 29 console.log('通常の場合'); 30 console.log(lastData); 31 }).catch((err) => { 32 console.log(err); 33 var msg = JSON.parse(err); 34 console.log('エラーの場合'); 35 console.log(msg); 36 result = msg; 37 }); 38 console.log('最後'); 39 console.log('createUser result'); 40 console.log(result); 41 res.end('Hello World'); 42 }) 43 break; 44 } 45}; 46 47async function createUser(jsonData) { 48 const user = { 49 user: { 50 login: jsonData.username, 51 password: jsonData.password, 52 firstname: jsonData.firstname, 53 lastname: jsonData.lastname, 54 mail: jsonData.email, 55 } 56 } 57 58 let lastResult; 59 60 console.log('真ん中redmine前'); 61 try { 62 redmine.create_user(user, async function (err, data) { 63 if (err) throw err; 64 lastResult = data; 65 console.log(data); 66 }) 67 } catch (error) { 68 console.log('真ん中redmineエラー中'); 69 console.log(error); 70 lastResult = error; 71 } 72 console.log('真ん中redmine後'); 73 console.log(lastResult); 74 return lastResult; 75}
実行結果はこちらです。
最初 qs.parse jsonData { username: 'test100', password: 'asdf', firstname: 'test100', lastname: 'test100', email: 'test100@test.com' } 真ん中redmine前 真ん中redmine後 undefined 通常の場合 undefined 最後 createUser result undefined (node:11136) UnhandledPromiseRejectionWarning: {"ErrorCode":422,"Message":"Unprocessable Entity","Detail":{"errors":["パスワード は8文字以上で入力してください"]}} (node:11136) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:11136) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
本当であれば、createUser関数を呼び出した時点で、errが発生し、catchするはずなのですが、その結果をcatchできておらず、最後に出力されています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。