Comments 27

Хорошая подборка для новичков. Хотя местами статья явно устарела. Пример объекта AppError содержит ошибки, при этом Error расширяется не совсем корректно, так же можно избежать использования lodash для такой простой операции как merge:


function AppError(code, data) {
  let message = code.replace(/_/g, ' '); // Превращаем user_not_found в "user not found".

  Error.call(this, message);
  Error.captureStackTrace(this, this.constructor);

  this.code = code;
  this.message = message;
  this.name = this.constructor.name; // Вывод в консоль не должен страдать, так что добавляем имя
  this.data = Object.assign({}, data); // Используем data для удобной конвертации в JSON и для избежания конфликта имен свойств.
}

Object.setPrototypeOf(AppError.prototype, Error.prototype); // new AppError('some_code') instanceof Error

Спасибо, исправил!


Я не показываю подробно всего, что можно сделать в кастомной ошибке, это зависит от конкретного проекта, например в своих проектах я обычно добавляю свойство uiShow, которое определяет показывать ли ошибку на клиенте как есть или общее сообщение типа "Server Error", а текст ошибки вычитывается по коду ошибки, а не преобразует сам код в виде читабельной строки.

Object.assign ни в коем случае не замена lodash-евскому _.merge

let a = {a:{a:1}};
let b = Object.assign({}, a);
a.a.a = 2;
console.log(b.a.a === a.a.a); // true


let a = {a:{a:1}};
let b = _.merge({}, a);
a.a.a = 2;
console.log(b.a.a === a.a.a); // false
«Строим свой full-stack на JavaScript: Сервер tutorial»

https://github.com/yegor-sytnyk/contoso-express
>> TypeScript 95.4%

TypeScript !== Javascript
Вот из-за того, что вы говорите то, что не думаете и думаете то, что не думаете — вот из за этого у вас все проблемы.

— Кин Дза Дза


Вся суть джаваскрипта в двух коментариях короче.

Node 6.5.0 не считает этот код валидным, хотя это валидный код TS

function greeter(person: string) {
    return "Hello, " + person;
}

а судя по этой таблице https://kangax.github.io/compat-table/es6/#node6 нода достаточно хорошо поддерживает новые стандарты JS

да прогоните typescript через tsc, target es6 и получите тот же код только без упоминания типов. Считать typescript самостоятельным языком? Ну ок, наверно такие люди тоже для чего то нужны.

Ну точно так же можно прогнать и Dart и Coffeescript. Являются ли они отдельными языками? Можно даже использовать Emscripten, вы удивитесь сколько языков можно скомпилировать в javascript. Но нигде не утверждается что они являются javascript'ом.

И ответ DenimTornado: если вам не нравится javascript — не пишите на нем. Пишите на Typescript, JScript, Dart, Coffeescript если вам хочется. Но пожалуйста, не называйте эти языки javascript'ом. Это вводит в заблуждение сообщество и убивает веб.
вы удивитесь сколько языков можно скомпилировать в javascript.

Не удивлюсь, я в курсе. Все началось с вот этого:
Строим свой full-stack на JavaScript: Сервер tutorial»


https://github.com/yegor-sytnyk/contoso-express


TypeScript 95.4%

Я считаю что скомпилировав код проекта в js и используя полученный результат МОЖНО утверждать что мы строим стек на javascript. Возражения?

А вот если сохранить большой кусок Javascript кода с разрешением .ts, он продолжит работать?

В пределе всё всё равно сводится к маш. кодам. Но люди почему-то не любят их использовать.

Ну всё-таки на данный момент TS транспайлится в JS, и самостоятельно не используется, так что не такое уж вопиющее несоответствие.

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


TS расширение JS, поэтому код на TS должно быть легко читать даже тем, кто с TS не знаком.


Например flow от Facebook, вообще позиционируется как static type checker, а не отдельный язык, хоть и добавляет аннотации типов в JS.


Как я уже писал TS имеет как плюсы так и минусы и каждый сам решает насколько ему это подходит, я планирую добавить альтернативную ветку в Contoso с JS имплементацией.

В списке отдельных фреймворков наверно можно было бы поместить meteor.js все таки он пока что из node.js фреймворков на github он самый популярный.

Можно, пожалуйста, привести пример, когда результат typeof от переменной со строкой будет не равен «string»?
То есть когда выполнится неравенство typeof str !== 'string' && str instanceof String
Ну ведь верно же:

var str = new String();
console.log(typeof str !== 'string' && str instanceof String);

выведет true.

Так. а что ожидалось? (просто вопрос был "когда выполнится неравенство" — я дал пример того когда оно выполняется)

Это и ожидалось, но кто-то решил влепить -1 и я решил поддержать эту конструкцию из new String(). Хотя вообще не представляю ситуации в которых такое определение строки может иметь преимущества перед литеральной записью.

А, в этом смысле. Я уже на минусы не заморачиваюсь — похоже аудитория вконтакта прочно переехала на хабр. А по поводу объекта — "не представляю ситуации в которых такое определение строки может иметь преимущества перед литеральной записью" — тут дело не в преимуществе, тут дело в том что есть ситуации когда заранее не знаешь входящий тип, вот и приходится перестраховываться (модуль например какой пишешь или привязываешься сам к чьему то модулю и подозреваешь изменения в будущих версиях. В общем бывают ситуации.

Например, знаменитое 0.1 + 0.2 не равняется 0.3 в связи с тем, что в JavaScript нет встроенного десятичного типа.

Может, я чего-то не понимаю в знаменитостях, но еще на первом курсе любого технического вуза рассказывали как сравнивать типы с плавающей точкой?


Loopback

Могу поделится своим негативным опытом. Дело было год назад. Речь о REST API сервере.
Штука в целом прикольная — ты такой накидал конфигурацию, а оно такой быстренько поехало. Ну почти.
Только хвалёный ORM не может делать джойны в БД. Ну и эпизодически выплывали интересные артефакты, связанные с тем, что местному ORM-у, ну скажем так, есть еще куда расти.
Справедливости ради, архитектурно там предусмотрены дырки, куда можно засунуть правильную реализацию джойнов и всего этого database-related добра с учетом специфики конкретной базы, но на тот момент готовых компонент для этого не нашлось.
Ну и в ряде мест оно необъяснимо тормозило. В документации об этом разумеется не писали, но дебаг приводил опять же в ORM.


В результате переписали за месяц на Express + Mongoose. Стало лучше, быстрее, и главное проще и более предсказуемо.

Only those users with full accounts are able to leave comments. Log in, please.