🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MongoDB

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

Node.js

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

JavaScript

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

Q&A

解決済

1回答

1747閲覧

NodeJSのMongoDBにおけるasync awaitによる同期処理

undesu_

総合スコア1

MongoDB

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

Node.js

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

JavaScript

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

0グッド

0クリップ

投稿2021/02/01 09:44

編集2021/02/01 10:22

前提・実現したいこと

Node.js初心者です.MongoDBの練習をしています.データを挿入してから表示するという同期処理のプログラムを作成しています.
Node.jsは非同期処理されるので,あとで行いたい処理をcallbackにいれる必要があるが,async/awaitを使用することで,同期処理を行えると書いてありましたので,やってみたのですが,以下のエラーメッセージのようになってしまいます.エラー分を見てみると,「awaitはasync 関数でのみ有効です.」となっておりますが,ソースコードを見ると,asyncの中にawaitが記述されていることがわかります.
どうすれば,これを解決できるでしょうか?
また独学でやっておりますので,間違っている可能性が十分にあります.もし間違っているようでしたら,正解のソースコードをお願いします.
####環境

  • Windows10
  • Node.js v14.15.4
  • MongoDB server version: 4.4.3
  • VSCode

発生している問題・エラーメッセージ

await in_Collection(db); ^^^^^ SyntaxError: await is only valid in async function at wrapSafe (internal/modules/cjs/loader.js:979:16) at Module._compile (internal/modules/cjs/loader.js:1027:27) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10 ) at Module.load (internal/modules/cjs/loader.js:928:32) at Function.Module._load (internal/modules/cjs/loader.js:769:14) at Function.executeUserEntryPoint [as runMain] (internal/modules/run_mai n.js:72:12) at internal/main/run_main_module.js:17:47

該当のソースコード

js

1const mongodb = require("mongodb") 2const MongoClient = mongodb.MongoClient 3 4const connectOption = { 5 useNewUrlParser: true, 6 useUnifiedTopology: true, 7} 8 9DataBase() 10 11async function DataBase(){ 12 MongoClient.connect("mongodb://localhost:27017",connectOption, (err, client) => { 13 //エラーやったら投げる 14 if (err) throw err; 15 //コネクトできた 16 console.log("Connected successfully to server"); 17 18 //Mongo3.0から,明示しないといけない 19 const db = client.db("myDB"); 20 21 // 追加 22 await in_Collection(db); 23 //取得 24 await get_Collection(db); 25 client.close(); 26 27 }); 28} 29 30const in_Collection = (db, callback) => { 31 const documents = [ 32 { a: 1 }, 33 { a: 2 }, 34 { a: 3 } 35 ]; 36 db.collection("documents").insertMany(documents, (err, result) => { 37 console.log(result); 38 }) 39} 40 41const get_Collection = (db, callback) => { 42 //コレクションを配列にして,resultにいれる. 43 db.collection("documents").find({}).toArray( (err, result) => { 44 if (err) throw err; 45 console.log(result) 46 }) 47}

###続き
yambejpの回答によって,「SyntaxError: await is only valid in async function」の問題は解決しました.
プログラムを直して以下の「ソースコード2」のようにしました,実行したところ,以下の「コンソール・エラーメッセージ」のような出力とエラーが出ました.
これは,get_Collection()を待たずにclient.close();が実行されたことによって発生しています.
どうすれば,in_Collection() → get_Collection() → client.close();の順番に実行されるのでしょうか.

ソースコード2

js

1const mongodb = require("mongodb") 2const MongoClient = mongodb.MongoClient 3 4const connectOption = { 5 useNewUrlParser: true, 6 useUnifiedTopology: true, 7} 8 9 10const dataBase = MongoClient.connect("mongodb://localhost:27017",connectOption, async(err, client) => { 11 //エラーやったら投げる 12 if (err) throw err; 13 //コネクトできた 14 console.log("Connected successfully to server"); 15 16 //Mongo3.0から,明示しないといけない 17 const db = client.db("myDB"); 18 // 追加 19 await in_Collection(db); 20 //取得 21 await get_Collection(db); 22 console.log("3333") 23 await client.close(); 24 }); 25 26const in_Collection = (db) => { 27 console.log("1111") 28 const documents = [ 29 { a: 1 }, 30 { a: 2 }, 31 { a: 3 } 32 ]; 33 db.collection("documents").insertMany(documents, (err, result) => { 34 }) 35} 36 37const get_Collection = (db) => { 38 //コレクションを配列にして,resultにいれる. 39 db.collection("documents").find({}).toArray( (err, result) => { 40 console.log("2222") 41 if (err) throw err; 42 console.log(result) 43 }) 44} 45 46

コンソール・エラーメッセージ

Connected successfully to server 1111 3333 2222 C:\Users\name\OneDrive\デスクトップ\NodeJS\node_modules\mongodb\lib\utils.js:671 throw error; ^ MongoError: Cannot use a session that has ended

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

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

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

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

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

guest

回答1

0

ベストアンサー

DataBase()がasyncでもMongoClient.connectのコールバックがasyncではなくては
その中の関数のawait処理はできません

async(err, client) => {

的な処理でどうでしょうか?

投稿2021/02/01 09:49

yambejp

総合スコア116661

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

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

undesu_

2021/02/01 10:21

あろがとうございます.SyntaxError: await is only valid in async functionの問題は解決しました. ですが,別のエラーが発生したのでよろしければご回答お願いします.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問