私はモジュールの作成に少し慣れていないので、module.exportsについて疑問に思っていて、非同期関数(たとえば、mongo接続関数など)が完了して結果をエクスポートするのを待っていました。変数はモジュールでasync/awaitを使用して適切に定義されますが、モジュールを要求して変数をログに記録しようとすると、未定義として表示されます。誰かが私を正しい方向に向けることができれば、それは素晴らしいことです。これが私がこれまでに得たコードです:
// module.js
const MongoClient = require('mongodb').MongoClient
const mongo_Host = '127.0.0.1'
const mongo_db = 'test'
const mongo_port = '27017';
(async module => {
var client, db
var url = `mongodb://${mongo_Host}:${mongo_port}/${mongo_db}`
try {
// Use connect method to connect to the Server
client = await MongoClient.connect(url, {
useNewUrlParser: true
})
db = client.db(mongo_db)
} catch (err) {
console.error(err)
} finally {
// Exporting mongo just to test things
console.log(client) // Just to test things I tried logging the client here and it works. It doesn't show 'undefined' like test.js does when trying to console.log it from there
module.exports = {
client,
db
}
}
})(module)
そして、これはモジュールを必要とするjsです
// test.js
const {client} = require('./module')
console.log(client) // Logs 'undefined'
私はjsにかなり精通しており、非同期/待機や機能のようなものを積極的に学び、調べていますが、そうです...それを実際に理解することはできません
同期してエクスポートする必要があるため、client
およびdb
を直接エクスポートすることは不可能です。ただし、client
およびdb
に解決されるPromiseをエクスポートできます。
_module.exports = (async function() {
const client = await MongoClient.connect(url, {
useNewUrlParser: true
});
const db = client.db(mongo_db);
return { client, db };
})();
_
したがって、次のようにインポートできます。
_const {client, db} = await require("yourmodule");
_
(それ自体が非同期関数内にある必要があります)
PS:console.error(err)
は、クラッシュするだけでエラーを処理できない場合、適切なエラーハンドラではありません
上記の@Jonas Wilmsが提供するソリューションは機能していますが、接続を再利用するたびに非同期関数でrequireを呼び出す必要があります。別の方法は、コールバック関数を使用してmongoDBクライアントオブジェクトを返すことです。
mongo.js:
const MongoClient = require('mongodb').MongoClient;
const uri = "mongodb+srv://<user>:<pwd>@<Host and port>?retryWrites=true";
const mongoClient = async function(cb) {
const client = await MongoClient.connect(uri, {
useNewUrlParser: true
});
cb(client);
};
module.exports = {mongoClient}
次に、別のファイル(高速ルートまたはその他のjsファイル)でmongoClientメソッドを使用できます。
app.js:
var client;
const mongo = require('path to mongo.js');
mongo.mongoClient((connection) => {
client = connection;
});
//declare express app and listen....
//simple post reuest to store a student..
app.post('/', async (req, res, next) => {
const newStudent = {
name: req.body.name,
description: req.body.description,
studentId: req.body.studetId,
image: req.body.image
};
try
{
await client.db('university').collection('students').insertOne({newStudent});
}
catch(err)
{
console.log(err);
return res.status(500).json({ error: err});
}
return res.status(201).json({ message: 'Student added'});
};