前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/01 10:21