Могу ли я использовать замыкание для сохранения маршрутизатора, объявленного в функциональной области? - PullRequest
0 голосов
/ 31 января 2020

Я пишу 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 в функциональной области, а не в глобальной?
  • Можно ли использовать замыкание для сохранения маршрутизатора, объявленного в функциональной области?
...