Страницы

суббота, 28 июля 2018 г.

Node.js gRPC defaults

Вчера обновил grpc-node и после запуска приложения получил предупреждение: 'DeprecationWarning: grpc.load: Use the @grpc/proto-loader module with grpc.loadPackageDefinition instead'. В процессе выяснения причины оказалось что grpc-protobufjs среди прочих решает вопрос с дефолтными значениями: по умолчанию отсутствие значения интерпретируется как отсутствие значения, т.е. полю не присваивается дефолтное значение. Конец моим страданиям и разочарованиям, теперь можно избавляться от костылей. Кроме того исследование изменений в gRPC позволило мне ответить еще на один на вопрос: как передать метаданные с сервера на клиента без использования ошибки.

суббота, 17 марта 2018 г.

WTF with errors in gRPC?

Недавно мне задали вопрос: для чего нужен package-lock.json, я ответил: для того же для чего и npm-shrinkwrap.json - чтобы не было мучительно больно. Вчера обнаружил удивительный диссонанс между версиями 1.8.0 и 1.8.4 модуля gRPC, а именно изменения в процессе создания ошибки, вот от кого никак не ожидал. К примеру, если в версии 1.8.0 ошибка с сообщением 'Invalid name' на сервере предсказуемо превращалась в ошибку в таким же сообщением на клиенте, то в версии 1.8.4 на клиенте то же сообщение об ошибке превращается в '2 UNKNOWN: Invalid name'. WTF?

суббота, 24 февраля 2018 г.

Node.js Design Patterns

Сегодня дочитал второе издание Node.js Design Patterns. Очень полезное чтиво по разработке под Node.js, предыдущая версия в свое время мне тоже понравилась. Правда по ходу у меня появилось одно замечание, суть которого заключается в том, что автор вешает на процесс функцию слушателя события 'exit', которая является асинхронной, в то время как она должа быть синхронной, в противном случае у нас нет никаких гарантий в том, что эта функция выполнит свою миссию в полном объеме.

среда, 21 февраля 2018 г.

Mocha exclude node_modules

Для тестов в Node.js я использую mocha + assert, как говорится дешево и сердито. Если тесты лежат в отдельном каталоге, в package.json команда для их запуска как правило выглядит так: `mocha test/**/*.spec.js`, если рядом с исходниками, тогда как-то так: `mocha ./**/*.spec.js`. Только вот если в каталоге node_modules есть тесты которые попадают в глобальный паттерн, mocha их тоже выполнит, что на мой взгляд не всегда уместно. Исключить каталог node_modules можно следующим образом:

пятница, 19 января 2018 г.

JavaScript interview question

"Посетителю должно быть неудобно. Посетитель должен быть смешон. Иначе, какое от него удовольствие?", - братья Стругацкие"Обитаемый остров". Сегодня познакомился с задачей, которую можно использовать на собеседовании по JavaScript если вдруг появилось желание "сделать посетителю неудобно". Или собеседник знает в чем подвох, что маловероятно (вряд ли кто-либо использует подобные приемы на практике), или есть шанс получить процесс решения, который может кое-что рассказать о собеседнике. Не пытайтесь повторить это дома.

суббота, 9 декабря 2017 г.

Going to gRPC. Bidirectional streaming

В процессе проектирования одного приложения в какой-то момент я решил, что один сервис должен иметь возможность итерировать по коллекции, за которую отвечает другой. Не просто получать данные в виде списка или потока, а иметь возможность перечислять элементы коллекции по одному, а также прерывать процесс итерации. Не смотря на то, что в итоге ответственность за прерывание процесса досталась итератору, что позволило решению остаться в пределах парадигмы request-response, мне захотелось посмотреть как могло бы выглядеть решение на bidirectional streaming RPC.

воскресенье, 5 ноября 2017 г.

Handling errors in gRPC

Вчера прочитал один пост на тему обработки ошибок в gRPC. На мой взгляд передавать вместе с ошибкой стэк - это уже перебор: сообщение, статус, может быть какой-нибудь код, прочие дополнительные поля (например Retry-After), но не стэк. По-моему стэк должен быть залогирован там где произошла ошибка, после чего его миссия завершена. Кроме того я не согласен с автором на предмет того, каким образом передавать все эти дополнительные поля: идея передавать ошибку вместе с данными (или вместо данных) мне не нравится, думаю метаданные здесь подойдут лучше.

воскресенье, 29 октября 2017 г.

Going to gRPC

Недавно начал инвестигировать gRPC + Protocol Buffers. В Node.js профит сомнительный, по крайней мере до тех пор пока не появится стабильный http/2 (без флага --expose-http2), тем не менее никто не мешает уже сейчас использовать другую платформу, я бы предпочел Go. Первое знакомство с Node.js прошло без проблем, а вот с Go пришлось повозиться: скачать C++ реализацию protobuf, сбилдить protoc.exe с помощью CMake, после чего сбилдить protoc-gen-go (и не забыть добавить в переменную окружения PATH путь к protoc.exe).

суббота, 21 октября 2017 г.

Goodbye, Postman!

Позавчера я познакомился с расширением для Visual Studio Code по имени REST Client и понял что у него есть все шансы заменить в моем арсенале Postman - изначально приложение Google Chrome, а теперь и нативное приложение, которое я использую в процессе разработки в качестве REST-клиента на протяжении последних нескольких лет. Профит: 1) выполняем запросы не покидая Visual Studio Code 2) сохраняем запросы в текстовых файлах (.http или .rest) 3) на один Electron меньшe

пятница, 1 сентября 2017 г.

TypeScript Declaration Files

На HolyJS 2017 Piter я спросил у Дугласа Крокфорда что он думает по поводу TypeScript, и заодно сообщил ему что я обратил внимание на TypeScript с его подачи, на что он мне ответил, что если ты хочешь писать на C# - пиши на C#. Но я пишу серверный код на ES6, и почему не использовать вместе с линтером (ESLint, или если угодно JSHint от самого Дугласа Крокфорда) еще один инструмент, который дает нам IntelliSenseпроверку типов, и в результате позволяет всей команде двигаться быстрее? К сожалению этот вопрос остался без ответа потому что Дуглас Крокфорд ...