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

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

新規登録して質問してみよう
ただいま回答率
85.50%
MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

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

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Q&A

解決済

1回答

2089閲覧

コールバックによる戻り値の取得

mote

総合スコア128

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

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

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

0グッド

0クリップ

投稿2018/12/21 07:32

非同期処理のため、
結果1ではresultが出力されるのですが、
結果2ではresultがundefinedとして出力されてしまいます。

なんとかコールバックを使って上手くreturn値をserver.jsの
メソッド呼び出しで取得する事は出来ないでしょうか!?

この戻り値をsocket.ioでクライアントに送信をしたいです。
server.js内にmongoを含むchat.jsを直接書き込む事は
避けたいです。

node.js、javascriptに詳しい方どうかお願いします。

node

1let findall = function(){ 2 MongoClient.connect(url, { useNewUrlParser: true },function(err, db) { 3 4 if (err) throw err; 5 let dbo = db.db("mydb"); 6 dbo.collection("chat").find({},{ projection: { _id: 0 } }).toArray(function(err, result) { 7 if (err) throw err; 8 console.log("結果1:"result); 9 return result ; 10 db.close(); 11 }); 12 }); 13} 14module.exports.findall = findall ; 15

↑chat.js

node

1let chat_find=require("./chat.js").findall ; 2function chat_socket(req,res){ 3 let a = chat_find() ; 4 console.log("結果2:"+a) ; 5 socket.emit("msg_server",data) ; 6 }) ; 7 }); 8};

↑server.js

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

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

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

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

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

guest

回答1

0

ベストアンサー

Promiseで、どうでしょう?

chat.jsは、

node

1let findall = function(){ 2 let pr = new Promise(function(resolve, reject){ //追加 3 MongoClient.connect(url, { useNewUrlParser: true },function(err, db) { 4 5 if (err) throw err; 6 let dbo = db.db("mydb"); 7 dbo.collection("chat").find({},{ projection: { _id: 0 } 8 }).toArray(function(err, result) { 9 if (err) throw err; 10 console.log("結果1:"result); 11 resolve(result) ; //変更 12 db.close(); 13 }); 14 }); 15 }); 16 17 return pr; //追加 18}

server.jsは、

node

1function chat_socket(req, res){ 2 chat_find().then(function(a) { //変更 3 console.log("結果2:"+a) ; 4 socket.emit("msg_server",data) ; //data? 5 }) ; 6};

元のソースに少し違和感ありますが、該当箇所以外は、変えませんでした。

投稿2018/12/21 08:32

Meganezaru

総合スコア715

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

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

mote

2018/12/21 10:59

socketの第二引数 a でしたね。 すみません。 promiseを使ったら上手く出来ました!! 感謝です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問