Задать вопрос
OscarS
@OscarS

Best practice подключения к express js приложению сторонних библиотек без жесткой связи?

Добрый день!
Подскажите как правильно реализовать структуру проекта в express? Сам продолжительное время работаю на PhalconPHP и хочу переписать некоторые проекты на express, но встретился с проблемой: архитектуры express js проекта в частности с DI, Module Require. И не могу сообразить как лучше подключать сторонние библитеки без DI, и как это сделать с Module Require, чтобы не было жесткой связи с библиотеками.

Сейчас делаю таким образом, но не уверен что правильно
//db.js
var mysql = require('promise-mysql');
var config = require('../config');

var pool = mysql.createPool(config.db);

module.exports = pool;

//users.js
var express = require('express');
var router = express.Router();

router.get('/', async function(req, res, next) {
  var db = await require('lib/db');
  
  var result = await db.query("SELECT 1 + 1 AS test");
  
  res.send(result);
});
module.exports = router;

Структура
routes/users.js
lib/db.js
app.js
config.js
  • Вопрос задан
  • 78 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@RidgeA
Хотя этот подход работает, но я бы так не делел - это как раз и создает жесткую привязку библиотеки и вызываемой функции. Тестировать это будет сложно
Как можно сделать:

1. Передавать зависимости в функцию обработчик через замыкание, например:
async handler (db) {
  return  (req, res, next) => {   
    var result = await db.query("SELECT 1 + 1 AS test");
    res.send(result);
  }
})
db = require('lib/db');

router.get('/', handler(db));


аналогичный же подход можно сделать с помощью объектов и классов, где передавать зависимости в конструктор, при этом надо не потерять this при передаче функции в качестве обработчика

2. ExpressJS позволяет присваивать какие-то объекты контексту ответа или контексту самого приложения.
- ответ - expressjs.com/en/4x/api.html#res.locals
- приложение - expressjs.com/en/4x/api.html#app.locals

3. В npm есть пакеты, которые реализовывают DI, но тут ничего не могу порекомендовать - не пользовался.
Можно делать так, но это не совсем очевидно
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы