質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

Redmine

Redmineは、プロジェクトのタスク管理、進捗管理、情報共有が可能な、 オープンソースプロジェクト管理ソフトウェアです。

Q&A

解決済

1回答

907閲覧

nodemoduleの実行結果を同期的に取得したい redmine

AInoue

総合スコア17

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

Redmine

Redmineは、プロジェクトのタスク管理、進捗管理、情報共有が可能な、 オープンソースプロジェクト管理ソフトウェアです。

0グッド

0クリップ

投稿2020/05/11 04:07

編集2020/05/12 05:19

現在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できておらず、最後に出力されています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

Promiseをよくわかっていませんでした。

時間がかかる処理をPromiseにしないといけなかったので、redmineの処理結果をPromiseで受け取るようにし、その結果を待つようにしたことで、最終的に結果を受け取ってresで返すことができるようになりました。

case '/complete': var data = ''; req.on('readable', function (chunk) { data += req.read() || ''; }); req.on('end', function () { var jsonData; jsonData = qs.parse(data); const user = { user: { login: jsonData.username, password: jsonData.password, firstname: jsonData.firstname, lastname: jsonData.lastname, mail: jsonData.email, } } redmine.create_user(user, function (err, data) { new Promise((resolve, reject) => { if (err) throw err; resolve(data); reject(err) }).then((successResult) => { var content = ejs.render(confirm_page, successResult); res.writeHead(200, { 'Content-Type': 'text/html' }); res.write(content); res.end(); }).catch((failedResult) => { var errAndData = JSON.parse(failedResult); errAndData['user'] = jsonData; var content = ejs.render(failed_page, errAndData); res.writeHead(200, { 'Content-Type': 'text/html' }); res.write(content); res.end(); }) }) }); break;

投稿2020/05/15 02:45

AInoue

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問