Я пишу REST API в Express, который будет взаимодействовать с базой данных MongoDB. Но поскольку я изо всех сил пытался запустить код, я понимаю, что мне не хватает понимания того, как обрабатывается соединение с базой данных в асинхронном программировании, управляемом событиями.
Мой код ниже работает, но есть вещи, которые я до сих пор плохо понимаю.
[server.js]
const lauchServer = (async () => {
try { // lauch MongoDB server => db => collections
const clientObj = await MongoClient.connect(serverURI, {
forceServerObjectId: true,
useNewUrlParser: true,
useUnifiedTopology: true
});
const dbObj = clientObj.db(dbName);
const apiRouters = await Promise.all(collectionNames
.map(async name => {
const router = new express.Router();
await router
.route(`/api/${name}/`)
.get(crud(dbObj.collection(`${name}s`))["getMany"])
.post(crud(dbObj.collection(`${name}s`))["createOne"]);
await router
.route(`/api/${name}/:id`)
.get(crud(dbObj.collection(`${name}s`))["getOne"])
.put(crud(dbObj.collection(`${name}s`))["updateOne"])
.delete(crud(dbObj.collection(`${name}s`))["removeOne"]);
return (() => router);
}));
apiRouters.forEach(el => app.use(el()));
}
catch (errors) {
debug(`Failed at connecting to server: ${errors.toString()}`);
debug(`${dbName}`);
}
})();
И ниже часть из моего фрагмент кода, выполняющий функции работы с базой данных CRUD: [crudOperations.js]
/* Functional interfaces implmenting Stategy pattern:
CRUD database operations involving singular data request.
@param (collection) : instanceof `mongodb.Collection`
@param (req,res) : instanceof Node `Request` object, `Response` object
*/
//blah blah blah
const getMany = (collection) => async (req, res) => {
try {
const queryResult = await collection.find(req.body);
if (!queryResult) {
// HTTP code 404: resource not found
res.status(404).send('No response!');
} else {
// HTTP code 200: OK
res.status(200).json({ content: queryResult });
}
}
catch (errors) {
debug(`Errors happened at ${collection}.getOne: ${errors.toString()}`);
res.status(400).json({ errors: errors.toString() })
}
// blah blah blah
module.exports = (collection) => ({
createOne: createOne(collection),
getOne: getOne(collection),
getMany: getMany(collection),
updateOne: updateOne(collection),
removeOne: removeOne(collection)
});
}
Итак, мои вопросы:
- Необходимо ли в любой момент закрыть MongoClient.db?
- Возможно ли применить Router к приложению Express в функциональной области, а не в глобальной?
- Можно ли использовать замыкание для сохранения маршрутизатора, объявленного в функциональной области?