Реклама
Комментарии 23
Очень лаконичный код получается. Для микросервисов самое то!

Модуль-роутер, должен возвращать фабрику, а не инстанс роутера.

Вы правы, хотел минимизировать. Поправил код, теперь экспортрую 2 функции.

Нет, я имел в виду другое. Модуль должен экспортировать такой же middleware, как и любой другой middleware. Пример на gist.

Так в новой редакции у меня так и есть. Там роутер производит 2 разных middleware: 1 сами роуты, 2 заглушка, котрая правильно отвечает на вызов недопустимого метода. Но ее теретически можно не подключать, от этого REST сильно в функциональности не потеряет. В первой редакции это было не так, там эксортился инстанс роута, а он сам по себе middleware не является. Для генерации основного middleware у него надо вызвать метод router.routes()

По сути модель лучше перенести в options, тогда появится возможность передать модель настроенную на работу с другой коллекцией (например). Потому что сейчас роутер напрямую зависим от файла 'models/router', чего лучше избегать в модульном приложении.

Вот пример того как это должно выглядеть. Это нужно для того, чтобы сделать приложение по-настоящему модульным. Иначе получается монолитное приложение разбитое на несколько файлов. В идеале, в middleware через аргументы должен передаваться сервис, который будет выполнять необходимую работу, а в роутере должна быть только логика по валидации запроса, разрешению прав и трансформации HTTP-запроса в вызов метода.

Имхо, вы оверинженерите.

> Это нужно для того, чтобы сделать приложение по-настоящему модульным. Иначе получается монолитное приложение разбитое на несколько файлов.

По-моему, это одно и тоже. Полагаю, что под «по-настоящему модульным», вы имели в виду «переиспользуемые модули». Но здесь нечего переиспользовать. options пока что не нужен и не известно, понадобится ли еще.

Я начал этот разговор, потому что, мне кажется, это распространенная проблема в сообществе nodejs. Все радостно убежали от ООП к функциональщине со словами «ООП нужно использовать там, где он нужен». Но вместо классов теперь оверинженерят на функциях. Часто можно обойтись и без дополнительной функции. Тем более, что классы хотя бы давали дополнительные точки расширения. Замыкания же насильно все инкапсулируют, не давая даже в простейших случаях подправить поведение функции. И при этом иногда приходится долго скакать по функциям, чтобы в итоге понять, что последовательность действий была весьма линейна.

Только поймите правильно, я не говорю, что именно этот ваш код сложно будет читать. Тут особо «скакать» не придется. Я говорю, что здесь можно не городить лишнего, потому что профит от этого пока что очень размыт. А это и есть оверинжениринг.

Это я бы назвал правилом хорошего тона, потому что позволяет даже новичкам начинать писать приложения, которые легко поддерживать. А главное это не требует бОльших усилий нежели написать монолит, зато избавляет от огромного количества проблем в будущем. Передавать внутрь сервис для маленького приложения не требуется, но это рекомендация.

Спасибо, очень интересно, возьму на заметку.
Кстати по поводу кода в CRUD можно же без стрелочных функций обойтись:
async create({ id, name, price = 0, currency = 'UAH' }) { ... }
Ну да
console.log(Boolean(1)) // true

Немного сложнее с датой, обычно для этого используют Moment.js:
console.log(moment("2016-08-07 22:48:37",'YYYY-MM-DD HH:mm:ss').toDate() instanceof Date) // true


На всякий случай, moment.js хоть и очень удобный, но очень медленный (на некоторых операциях). У меня был случай, что до 90% времени генерации страницы тратилось на обработку дат в moment.js. Его стоит использовать очень осторожно.
Нет не принят, из ES 2017 тут используется только синтаксис async/await, который находиться в стадии 'Stage 3 («Candidate»)', ожидаемое время стадии 'Stage 4 («Finished»)' конец ноября, до принятия «Async Functions»|осталось ждать несколько месяцев.
Все остальные синтаксические конструкции из стандарта ES 2015.

Имелся в виду ноябрь 2015, когда, из-за отсутствия второй реализации в браузере, асинхронные функции на четвёртую стадию и в ES2016 так и не попали. Как уже писал в комментариях к другому топику, на четвёртую стадию и в ES2017 асинхронные функции вывели 28 июля.

Вы реально считаете это rest-микросервисом??
GET /product — без пагинации, без вывода нужных полей, а сразу все…
Сохранение данных модели без валидации.
Про модель Product я вообще молчу.
GET /product — без пагинации, без вывода нужных полей, а сразу все…

А вы что хотели чтоб я вам здесь фреймворк написал? В статье столько кода, сколько нужно для демонстрации подхода Koa 2.


Сохранение данных модели без валидации.

Вы, видимо, еще очень начинающий программист — там все есть. Если это не так напишите мне SQL-инъекцию для этого сервиса.


Про модель Product я вообще молчу.

Да вы не молчите, пишите, не стесняйтесь, может мы разберемся где у вас проблемы.

Я бы еще добавил ответы ошибок в виде json, если accept содержит application/json. Очень удобным вариантом ответа является такой:


{
    "error": {
        "code": "wrong_token",
        "message": "Token not found, expired or already used",
        "data": {
            "tokenId": "327a595f-d493-498e-8c89-e3a8c24adc5f"
        }
    }
}

code совместно с data удобно использовать для формирования сообщения об ошибке пользователю (особенно в многоязычных приложениях). А message подходит для вывода в консоль.

А вы можете посоветовать хороший подакшн рэди так сказать ОRМ под js, а то все это напоминает пхп лет 10 назад только на js?

В мире nodejs самая популярная ORM для mysql это драйвер MySQL :).


У себя в компании мы не используем ORM. В этой статье мы говорим про микросервис, у которого, как правило, количество кода и таблиц небольшое, сам микросервис сильно "заточен" под базу с которой он работает. От него требуеться быстродействие и минимальное потребление ресурсов.


Вот некоторые ORM, на которые когда-то смотрел:


Спасибо. Офтоп. Есть такой сервис (http://www.js-data.io). Как вы думаете может ли это быть частично заменой обычному REST api?
Клиент работает с моделями, либа конвертит это в REST запросы к серверу.
Только полноправные пользователи могут оставлять комментарии. , пожалуйста.