Комментарии 45
По поводу module.exports vs. exports — можно просто делать везде module.exports:

function a() {
///
}

function b() {
///
}

module.exports = {
a: a,
b: b
};
Я так понял, что речь тут о том, что при присвоении exports = foo, exports перестает быть ссылкой на module.exports.

Это можно объяснить на таком примере:
var foo = { bar: {} };
var bar = foo.bar;

console.log(foo.bar); // {}

bar.baz = 123;
console.log(foo.bar); // { baz: 123 }

foo.bar = 123;
console.log(foo.bar); // 123

bar = 456;
console.log(foo.bar); // 123


Конечно можно всегда писать module.exports =…, но лучше понимать в чем дело.
По поводу п. 1. Для ноды достаточно просто писать расширения, чтобы разгрузить основной поток и выполнять тяжёлые вычисления на c++ в отдельных потоках.
Ошибкой является рассуждение о callback hell без вообще какого бы то ни было упоминания посулов (promise), и безальтернативная рекомендация async.js.
Рассуждение о callback hell странно слышать при наличии флага --harmony
Если честно, то звучит как «основные проблемы Node.js в выбранном языке и его практиках»
Ошибка №0: долбить зубилом по ноуту
Речь о КПДВ, если что.
А есть способ, чтобы чейнить функции в async.js, а не передавать их в виде массива?
Чтобы не
async.waterfall([ func, func, func], func)
а
async.waterfall()
.next(func(){})
.next(func(){})
.next(func(){})
.fail(func(){})
А чем плох массив? Можно просто использовать именованный и добавлять функции push'ами:
ar.push(func(){});
ar.push(func(){});
ar.push(func(){});
ar.push(func(){});
async.waterfall(ar,func);
В вашем синтаксисе я не понял, в какой момент цепочка должна уйти на запуск — после добавления fail'а?
И с неименованным можно:
async.waterfall([]
    .concat(func(){})
    .concat(func(){})
    .concat(func(){}),
 func(){}
)
Вы зря в примерах приводите async.js. Это все таки не стандарт, и даже не эффективное решение. Лучше сразу приводите примеры на промисах, тем более они уже в stable версии из коробки идут, если уж это для начинающих материал.
Да, описание решения на промисах было бы куда уместнее. Видимо автор решил, что если человек заметит у себя callback hell, то сможет найти подходящее решение сам.
Т.е. сейчас node.js поддерживает промисы нативно и можно отказаться от использования подобных либ https://github.com/kriskowal/q?
Да, текущая версия ноды 0.12.2 (Stable) поддерживает промисы нативно. 0.10.38 (Maintenance), если я не ошибаюсь, не поддерживает. Также вы можете попробовать IO.js
Большинство ошибок относится к асинхронной модели программирования, а не только к Node.js. И они не являются основными. Программист, допускающий их, не знает устройство своего языка.
Большинство начинающих программистов путаются в тонкостях языка и скорее не из-за незнания, а из-за неопытности. Статьи подобного рода помогают избежать лишней путаницы.
Из-за незнания. Именно поэтому лучше читать статьи подобные вот этой: http://habrahabr.ru/post/222761/

Вместо статьи где размазаны основные идеи на 100 предложений вместо списка на 10 строк (хороших практик):

1. из базы вызываем массив отсортированным
2. return callback();
3. используем async.waterfall или Promise
4. колбэки несинхронны
5. всегда module.exports
Статья слизана с: www.airpair.com/node.js/posts/top-10-mistakes-node-developers-make
Желательно указывать ссылку на оригинал.
Это перевод. У заголовка есть соответствующая отметка, а внизу — ссылка на оригинал.
>>ссылка на оригинал.
Вот за это люди и не уважают рунет. Перепечатка на перепечатке и даже оригинал не в состоянии указать. Минусите дальше хомяки. А лучше совсем забаньте меня, меня с вас тошнит.

Люди не способные проселдить оригинал или отдать дань уважения автору, не заслуживают уважения.
Читайте внимательнее. Это разные статьи на одну тему. Видно по составу указанных 10 пунктов.
Это особенно заметно по переставленным пунктам. То, что Mahmud Ridwan слизал статью переставив пункты не делает ему чести. Но то, что вы пытаетесь это игнорировать позорит вас ещё больше. Alexandru Vladutu написал статью 4 месяца назад, Mahmud Ridwan слизал ее, месяца даже не прошло.

Игнорировать неугодные факты похоже входит у некоторых людей в привычку.

Хомяки фас!


Год назад я сомневался, но теперь я вижу. Вы заслуживаете цензуру в полном объеме!
Отрицательная карма — это цензура, бан — тоже цензура. С учетом того, что статья «краденная» и нет отсылки на оригинал, а за указание этого факта я получаю «цензурную карму» вы должны радоваться наличию цензуры, а не ныть как год назад, что вас чем-то обижают. Вы заслужили цензуру.

Ставить отрицательную карму и выступать против цензуры — лицемерие в чистом виде!
А вы хотя бы ознакомились со статьями, перед тем, как громко кричать о том, что кто-то у кого-то украл. Даже при беглом просмотре видно, что в статьях есть общие моменты, а есть индивидуальные. Да и при обсуждении одних и тех же проблем, у авторов различные объяснения и примеры. С каких пор обсуждение одних и тех же вопросов стало плагиатом? Можете написать о своем видение основных ошибок при разработке на ноде, мы все с радостью почитаем!
Бессмысленно отрицать очевидное. Именно поэтому вы и заслужили цензуру. Вместо простого признания ошибки и указания оригинального источника хомяки сражаются с несогласным… В чём проблема? Просто забаньте.
Потому что мы злодеи — поощряем страдания того, кто сам погрязает в собственном безумии.
А прочитать обе статьи слабо? Ничего что пункты РАЗНЫЕ, а не переставленные?

Кстати, где Вы взяли слово «хомяки» Прямо как школьник. Или лавры старых интернет-задротов покоя не дают? Так мода на задротство прошла.
Извините, персонально вы из детсада. ;)

Я прочитал обе, обе статьи слабые, но эта самая жуткая из-за картинок нарисованных человеком у которого возможно была насильственная лоботомия.

ПС: Ничто в этом мире не заставит меня поменять своё мнение, что статья вымучена, чтобы спереть 10 ошибок. Если вам это не нравиться, то можете рвать на нижней части спины волосы сколько влезет, я все равно буду считать что мсье «хомяк». Иначе бы не написал коммент через 4 дня, да к тому же когда уже итак все насрали в карму. Собственно вы просто подтвердили, что принадлежите к стаду.
Подтвердить свои слова готовы?
Давайте по номерам, какие ошибки спёрты? Со ссылками, откуда они спёрты (естественно, с номером в первоисточнике).
Но проблемо.

1 nodemon (Ошибка десятая: не использование программ-диспетчеров)
2 Blocking the event loop (Ошибка первая: блокирование цикла событий)
3 Executing a callback multiple times (Ошибка вторая: вызов колбэка более одного раза)
4 Callback Hell (Ошибка третья: глубоко вложенные колбэки)
5 Creating big monolithic applications (Ошибка четвёртая: рассчитывать, что колбэки будут выполняться синхронно)
6 Poor logging
7 No tests
8 Not using static analysis tools
9 Zero monitoring or profiling
10 Debugging with console.log (Ошибка девятая: использование Console.log для отладки)

Притянутое за уши (высосано для отличий):
Ошибка пятая: присвоение “exports” вместо “module.exports” — (в js разве по другому? при чем тут nodejs? Таких ошибок можно еще море навыдумывать и все будут в js)
Ошибка седьмая: предполагать, что все числа целочисленные (туда же, привет js)
Ошибка восьмая: игнорирование преимуществ потоковых API (шо, nodejs?)

Про это даже писать не стоило. Это из разряда КЭП.

Ошибка шестая: генерация ошибок внутри колбэков () — единственная отличительная ошибка. Про неё стоило написать подробно, но автор не способен похоже. Игнорировать логирование, вообще позор. Это наверное самая страшная ошибка.

Большинство «читателей» темы похоже не знакомы с образованием. Если написали науч. работу и не упомянули оригинал, вас носом ткнут за отсутствие отсылки на оригинал. Если защищаете автора статьи, то он не чист на руку, если защищаете автора перевода, то тоже всё печально, если он не в состоянии сравнить статьи. Гордость не позволяет?

Минусаторы показывают, насколько они не в состоянии анализировать. Мне на минусы плевать, мне тут похоже делать совсем нечего.

Ну, пожалуй хватит. Это было скучно, но забавно для наблюдения рефлексии. ;)

Думать не пробовали?
Минусаторы сбежали из ВКонтакта. Мы здесь не о них. Плюсы и минусы ставят за «котиков» — это я уже заметил.

Совпадение на 60%. Согласен, я был не прав.
Статья — не украдена, но такой большой процент заимствования нужно сопровождать ссылкой.

Учитывая качество статьи (пресловутая притянутость за уши), я не исключаю, что автор мог тупо не знать о другой статье.

Ошибки
2 Blocking the event loop (Ошибка первая: блокирование цикла событий)
3 Executing a callback multiple times (Ошибка вторая: вызов колбэка более одного раза)
5 Creating big monolithic applications (Ошибка четвёртая: рассчитывать, что колбэки будут выполняться синхронно)

сами по себе достаточно очевидны, могли быть выявлены независимо.

Остаётся 30% — всё равно много.

UPD:
Кстати, с трудом себе представляю человека, способного совершить ошибки
3 Executing a callback multiple times (Ошибка вторая: вызов колбэка более одного раза)
5 Creating big monolithic applications (Ошибка четвёртая: рассчитывать, что колбэки будут выполняться синхронно)
>>Кстати, с трудом себе представляю человека, способного совершить ошибки
>>5 Creating big monolithic applications (Ошибка четвёртая: рассчитывать, что колбэки будут выполняться синхронно)
На эти грабли персонально наступил :) Не в таком примере как выше, но суть та же.
Спичка вспыхнула и сгорела… чего вы так взъелись? Одного сообщения в стиле «негодую» хватит, ненужно троллинг разводить
Math.pow(2, 53) | 1 === 0 // true

Вот здесь не совсем понятно… Почему здесь будет true? OR c 1 всегда должен давать 1 не зависимо от другого аргумента. Консоль хрома выдает результат:
Math.pow(2, 53) | 1 === 0
0
Math.pow(2, 53) | 1
1

Или это какая-то особенность именно Node.js?
Этот код равносилен Math.pow(2, 53) | (1 === 0) , а нужно (Math.pow(2, 53) | 1) === 0
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.