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

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

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

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

Q&A

解決済

1回答

1107閲覧

node.jsでのboolean型の戻り値が正常に動きません

mote

総合スコア128

Node.js

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

0グッド

0クリップ

投稿2018/11/24 09:06

編集2018/11/26 13:28

色々試してみたのですが、アロー関数での
戻り値の使い方がいまいち分かっていません。

下のようなコードにしてみても返って来るのは
undefinedです

js

1login(){ 2 console.log("login") ; 3 MongoClient.connect(url,{ useNewUrlParser: true }, (err, db) =>{ 4 5 if (err) throw err ; 6 let myobj = {name : this.name, password : this.password } ; 7 let dbo = db.db("mydb"); 8 dbo.collection("students").findOne(myobj,(err,result)=>{ 9 if(result==null){ 10 console.log("あなたは登録されていません"); 11return false ; 12 }else{ 13 console.log("name:" + this.name + ",password:" + this.password + "は既に登録しています") ; 14return true 15 } 16 db.close() ; 17 }); 18 }); 19 } 20 21 22console.log(login());

違う方法として
flagを使ってみたのですが
以下の方法だと常にfalseが返ってきてしまいます。

js

1login(){ 2 console.log("login") ; 3falg = false ; 4 MongoClient.connect(url,{ useNewUrlParser: true }, (err, db) =>{ 5 6 if (err) throw err ; 7 let myobj = {name : this.name, password : this.password } ; 8 let dbo = db.db("mydb"); 9 dbo.collection("students").findOne(myobj,(err,result)=>{ 10 if(result==null){ 11 console.log("あなたは登録されていません"); 12flag = false ; 13 }else{ 14 console.log("name:" + this.name + ",password:" + this.password + "は既に登録しています") ; 15flag = true ; 16 } 17 db.close() ; 18 }); 19 }); 20return flag ; 21 } 22 23 24console.log(login());

アロー関数内のみでしかflagが扱えていない等の理由
だと思うのですが、どう頑張っても
ture,falseの場合分けが出来ません。

consol.log("あなたは登録されています")などのifの場合分けは
問題なく分岐出来てます。

どなたかよろしくお願いいたします

追記
ご回答していただいた通り、
promiseを使って書き直して見たのですが、
async()関数無いでないとawaitFunc()が使えないのでしょうか??

自分はこのawaitFuncを別のページでif文の分岐で使いたいです

js

1login(){ 2 console.log("login") ; 3 4 MongoClient.connect(url,{ useNewUrlParser: true }, (err, db) =>{ 5 if (err) throw err ; 6 let myobj = {name : this.name, password : this.password } ; 7 let dbo = db.db("mydb"); 8 9 10 dbo.collection("students").findOne(myobj,(err,result)=>{ 11 const func = async () => { 12 let flag = false ; 13 if(result==null){ 14 console.log("あなたは登録されていません") 15 return = false ; 16 }else{ 17 console.log("name:" + this.name + ",password:" + this.password + "は既に登録しています") ; 18 return = true ; 19 } 20 db.close() ; 21 22 const awaitFunc = async () => { 23 console.log(await func()); 24 }; 25 awaitFunc(); 26 }); 27 }); 28}

というように書き直したのですが、
自分のやりたいことは下のような事です。
要は、login()関数を呼び出したらtrue or falseが返って来るようにしたいのです
processでは不可能なのでしょうか!?

js

1login(){ 2 console.log("login") ; 3 4 MongoClient.connect(url,{ useNewUrlParser: true }, (err, db) =>{ 5 if (err) throw err ; 6 let myobj = {name : this.name, password : this.password } ; 7 let dbo = db.db("mydb"); 8 9 10 dbo.collection("students").findOne(myobj,(err,result)=>{ 11 const func = async () => { 12 let flag = false ; 13 if(result==null){ 14 console.log("あなたは登録されていません") 15 return = false ; 16 }else{ 17 console.log("name:" + this.name + ",password:" + this.password + "は既に登録しています") ; 18 return = true ; 19 } 20 db.close() ; 21 22 const awaitFunc = async () => { 23 await func() 24 }; 25 26 }); 27 }); 28let a =awaitFunc(); 29return a ; 30}

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

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

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

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

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

guest

回答1

0

ベストアンサー

データベース処理はNode上では非同期に行われるものなので、同期的な返り値として結果を戻すことはできません

Promiseなどを使って、非同期に結果を伝達してください。

投稿2018/11/24 09:19

maisumakun

総合スコア145183

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

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

mote

2018/11/24 12:37

非同期なreturn文は上手く行かないと言うことを忘れていました。 一度promiseでやってみようと思います。
maisumakun

2018/11/28 09:00

> 要は、login()関数を呼び出したらtrue or falseが返って来るようにしたいのです 無理です。非同期処理が終わる前にlogin()を抜けてしまいますので、返り値は結果を見ずに返すしかありません(async functionは、返り値自体がPromiseとなっています)。
mote

2018/11/29 10:31

ありがとうございます。 promiseが理解できました。 コールバックをhtml側に送ることによって解決できました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問