«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2017/09/28 19:19:03  №1067752 1
Помогач, выручай. Есть один сайт, который выдает 503 Service Temporarily Unavailable. Задача - пофиксить это говно.
Я знаю что это поиск иголки в стоге сена, но любая инфа приветствуется.
Проблема не в хостинге - значит у меня.
Из остальных вариантов я слышал только о 2: дудос или медленного говно мамонта в медленном говнокоде который писал не я.
Условия: есть доступ к контрольной панели хостинга и много живительных пиздюлей.
Вопрос: как узнать каким говном этот сайт захлебнулся?
Ответы: >>1067810 >>1067860
Аноним 2017/09/28 21:17:37  №1067810 2
>>1067752
Сэмулируй у себя на локалке, посмотри, что будет. Почкму ты думаешь проблема не в хостинге?
Ответы: >>1067860 >>1067993
Аноним 2017/09/28 22:52:12  №1067860 3
>>1067752

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

А ты начинаешь вместо этого гадать, в чем дело.

>>1067810

Проблема может не повториться из-за другой конфигурации.

Ответы: >>1067993
Аноним 2017/09/29 09:34:56  №1067993 4
>>1067810
>Почкму ты думаешь проблема не в хостинге?
Хостинг заморский за кучу шекелей. Они клянуться что проблема не у них. На письма отвечают словами "баща данных" и прочими ругательствами

>>1067860
>почему бы не посмотреть логи ошибок веб-сервера
Maximum number of connection to host has been reached. Такие дела.
Ответы: >>1067996 >>1068041
Аноним 2017/09/29 13:32:39  №1068041 5
>>1067993
>Maximum number of connection to host has been reached

Это нагруженный проект?

Когда ты сам заходишь, получал ли 503?

Кинь ссылку, потестим. Если сикаешь, через pastebin закинь.

Если тебе самому выпадает через раз, попробуй
1) в корне html-страничку хелловорлд без PHP положи и раз 100 зайди.

2) Если будет опять 503, то, возможно:

а) >Боты-индексаторы, сканирующие ресурсы сайтов (поисковые системы, Sape и другие).

Nuff said. Настраивай robots.

б) >Использование элементов ресурсов или скриптов на чужих сайтах (ссылки на картинки, скрипты-информёры). Используйте антилич-модули/настройки.

Ну то есть очень много ссылаются на твои ресурсы напрямую извне и забивают процессорное время.

в) >На сайте установлен элемент, который периодически посылает на сервер AJAX-запросы (например, чат). Количество запросов зависит не только от числа посетителей, но и от их привычки открывать несколько вкладок в браузере.

Также все понятно.

г) >DDoS

Зависит от сайта, если он небольшой, кому он сдался дудосить?
Аноним 2017/09/29 14:32:36  №1068062 6
Ответы: >>1068576 >>1079886
Аноним 2017/09/29 15:23:05  №1068087 7
>>1068041
>Боты-индексаторы, сканирующие ресурсы сайтов (поисковые системы, Sape и другие).
Есть еще 1 вопрос на эту тему.
503 выдает 24/7, а googlebot не реагирует на delay. Единственный шанс снизить поток этого говна - Search Console, но я не могу подвердить правана сайт - он не отвечает.
Как поднять сайт максимально быстро 10 минут назад? бить по морде 403 всем подряд?
Ответы: >>1079886
someApprentice 2017/09/29 16:42:08  №1068108 8
Уже второй день не могу справиться с циклами в Обещаниях.

Вчера, я не мог асинхронно выполнить цикл

>getMessages().then(function(messages) {
>
>for (var key in messages) {
>console.log("LOOP: " + messages[key].id);
>
>decrypt(messages[key].content).then(function(decrypted) {
>console.log("PROMISE: " + messages[key].id);
>});
>}
>
>});
>
>//LOOP: 1
>//LOOP: 2
>//PROMISE: 2;
>//PROMISE: 2;

Поискав в интернете я нашел похожую проблему https://stackoverflow.com/questions/40328932/javascript-es6-promise-for-loop , и из её решения я понял что нужно написать функцию, которая рекурсивно вызывает Обещание одно за другим, и написал обёртку

decryptMessages(messages) {
var that = this;

function loop(messages, i) {
if (i === undefined) {
i = 0;
}

var length = Object.keys(messages).length;

encrypted = messages.content;

// + check if privateKey added
decrypted = that.decrypt(encrypted);

decrypted.then(function(decrypted) {
messages.content = decrypted.data;

if (i < length - 1) {
loop(messages, i + 1);
}
});
}

loop(messages);
};

----

getMessages().then(function(messages) {

decryptMessages(messages);

// Object {0: Object {id: 1, content:"DECRYPTED"}, 1: Object {id:2, content:"ONE MORE DECRYPTED"}}
// Perfect
console.log(messages);

for (key in messages) {
console.log(messages[key].content; // -----BEGIN PGP MESSAGE...
}

});

Из примера выше, внутри цикла, свойства итерируемых объектов почему-то остаются нерасшифрованными, не смотря на то что в коллекции они расшифровались.
Ещё одно странное поведение, при обращении к объекту в коллекции по ключу (messages[0].content) значение тоже выводиться не расшифрованным, значит дело не цикле, а в функции которая преобразует эти объекты. Для меня странно, что моя функция decryptMessages() ничего не возвращает, но это, наверно, потому что передается ссылка на объект, и далее он преобразуется в функции. Я ошибся тут? Что ещё тут я делаю не правильно (потому что корень проблемы начался с того что нельзя выполнять асинхронный код в синхронных циклах)?
Ответы: >>1070261 >>1079886 >>1079888
Аноним 2017/10/13 14:01:00  №1074880 9
14682181844860.jpg (67, 800x515)
515x800
>>1067944 (OP)
Привет.
Сверстал макет, понимаю html+css, основы php, отличу get от post, базовые знания ООП, что делать дальше не знаю, в интернетах нет толковых книг по php+sql с хорошими практическими задачками вроде тех которые в ОП посте. Вот по блядскому питону миллиарды книг на торрентах, по парсингу, хуярсингу, графике и проч.
Просмотрел курс Русакова, вполне сносно, вкратце поясняет и дает задачки, в отличии от СПЕЦЫАЛИСТА где за 15 часов поясняют что такое условия иф елсе и циклы.
Вроде как пхп один из самых "хайповых" языков, а путных книг вовсе нет, книг которые дали бы сильную базу от А до Я.
Короче хуй знает что со всеми этими знаниями делать, база есть, идей нет.
Чем занимаюсь сейчас? Читаю книжку по ООП и учу SQL, нахуя? Сам не знаю.
Ответы: >>1075042 >>1080119
Аноним 2017/10/13 21:50:37  №1075151 10
[a-z](0-9){3}[a-z]

Рег. выражение на проверку авт. номеров верное?
На regex101 оно никак не выделяет примеры.
Ответы: >>1080119
Аноним 2017/10/13 23:39:58  №1075232 11
14606535901550.jpg (111, 648x864)
864x648
ОП! Хочу выразить огромную благодарность тебе за старания, железную выдержку и терпеливое отношение к новичкам! Устроился без опыта работы с дропнутой вышкой джуном на 700$ в мухосрани, сейчас 20 лет, помню как начинал в 18 знакомиться с программированием по твоим анимешным урокам, помню радость от первого работающего скрипта с "искусcтвенным интеллектом", бросающим кубик (отсюда и ник на гитхабе), помню как несколько дней ломал голову над циклами и задачей про рост анона. С тех пор прорешал кучу задачек в треде, сейчас работаю с Symfony/Laravel (уже третий месяц).
Самыми полезными я считаю ревью ООП задач. Интересно, что тут много анонов несправедливо считают все эти задачи абстрактными и оторванными от реальности. А я решал их все + скидки и калькулятор с поддержкой чисел произвольной длины и скажу следующее: советы ОПа научили меня прагматичному и осторожному подходу к выделению абстракций, избавили от догматизма в отношении паттернов (теперь для меня паттерн - это прежде всего идея, а не диаграмма классов). Юнит-тесты помогли лучше понять DI и инкапсуляцию. Думаю, эти концепции более масштабируемы и универсальны, чем любые фреймворки. Этот фундамент позволяет сейчас без особого труда читать исходники фреймворков. Очень жизненными оказались задачи на SQL и JS.
Так что ОП учит правильными вещам за что ему ещё раз большое спасибо!
Ответы: >>1075251 >>1080119
someApprentice 2017/10/14 19:07:58  №1075611 12
Сегодня у меня была целая головная боль с получением доступа к mysql без sudo в Debian stretch.

Мне снова повезло, и я решил проблему выполнив:

UPDATE mysql.user SET plugin='' WHERE User='root';
FLUSH PRIVILEGES;

https://zalinux.ru/?p=1135

Но что за плагин(ы) я, так бездумно, отключил?

И как бы было "правильнее" решить эту проблему?
Ответы: >>1080119
Аноним 2017/10/22 12:48:16  №1079886 13
>>1068062

Решено верно.

>>1068087

Ты скорее всего неправильно настроил robots.txt, проверь в браузере, открывается ли он вообще и корректный ли синтаксис (я думаю, на яндексе или на гугле есть проверяльщик синтаксиса).

>>1068108

Я по коду хотел замечание сделать, ты зря делаешь 2 разных переменных с одним именем тут:

> decrypted.then(function(decrypted) {

Это создает путаницу, лучше назвать первую переменную decryptedPromise.

Также, у тебя нет обработки ошибок, а промисы по умолчанию "съедают" ошибки, и ты о них может быть не узнаешь (точнее, узнаешь, если поставишь обработчик unhandledPromise или как-то так).

Что касается промисов. Промис - это объект, представляющий значение, которое будет получено когда-то в будущем. Ты можешь преобразовать обещание вернуть значение A (Promise<A>) в обещание вернуть значение B (Promise<B>) c помощью метода then, в который передается функция, преобразующая A в B.

Соответственно расшифровка - это и есть преобразование (Array<encrypted> -> Array<decrypted>). На входе мы получим массив зашифрованных сообщение encrypted, на выходе мы должны вернуть массив расшифрованных сообщений decrypted. Расшифровка тоже асинхронная, но это не проблема так как функция-преобразователь A -> B может вернуть Promise<B> вместо самого значения B.

Пишем код:

function decryptMessageAsync(message) {
// отправляет сообщение на расшифровку и возвращает промис
}

var encryptedPromise = getMessages();
var decryptedMessagesPromise = encryptedPromise.then(function (encryptedMessages) {

// Получаем массив промизов расшифрованных сообщений
var decryptedPromises = encryptedMessages.map(decryptMessageAsync);

// получаем из массива промизов один промиз с массивом расшифрованных сообщений
return Promise.all(decryptedPromises);
});

В decryptedMessagesPromise мы имеем промиз, который вернет массив расшифрованных сообщений. Мы можем например передать его во view:

decryptedMessagesPromise.then(function (messages) {
view.showMessages(messages);
});

Другой вариант - добавить сообщения в локальное хранилище, изменение которого вызовет обновление view:

decryptedMessagesPromise.then(function (messages) {
messageStore.append(messages);
});

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

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

Также, тут есть недостаток. Расшифровка сообщений - асинхронная, но тут мы ждем, пока они не расшифруются все. Можно написать более продвинутую версию кода:

var encryptedPromise = getMessages();

// Promise<Array<Promise<decrypted>>>
var decryptedMessagesPromise = encryptedPromise.then(function (encryptedMessages) {

// Получаем массив промизов расшифрованных сообщений
var decryptedPromises = encryptedMessages.map(decryptMessageAsync);
return decryptedPromises;
});

decryptedMessagesPromise.then(function (decryptedPromiseArray) {
decryptedPromiseArray.each(function (decryptedPromise) {
decryptedPromise.done(function (decrypted) {
messagesView.displayMessage(decrypted);
});
})
});

Здесь мы видим громоздкую тяжелочитаемую конструкцию, а это верный признак проблемы, которая решается "добавлением еще одной абстракции". Попробуем применить тут реактивное программирование. Я напомню, что там есть объект Observable, который представляет собой поток каких-то событий. У нас будет 2 потока: поток, в который прибывают зашифрованные сообщения, и поток, в который приходя расшифрованные сообщения.

// Promise<encrypted[]>
var encryptedArrayPromise = getMessages();
// Поток массивов зашифрованных сообщений
var messageArrayStream = Rx.Observable.fromPromise(encryptedArrayPromise);
// Поток отдельных зашифрованных сообщений
var encryptedStream = messageArrayStream.flatMap((encryptedArray) => encryptedArray);
// Поток расшифрованных сообщений
var decryptedStream = encryptedStream.map(decryptMessageAsync);

decryptedStream.subscribe(function (decrypted) {
view.addOneMessage(decrypted);
});

Я должен тут предупредить, что я не писал ничего на Reactive и код отражает только общую идею. Не факт, что он работает.
Ответы: >>1082173
Аноним 2017/10/22 18:59:51  №1080119 14
>>1074880

В Оп посте есть минимум 3 задачи возрастающей сложности: список студентов, файлообменник, TestHub. С подробными комментариями. Также, если у тебя есть какая-то своя идея, какой сайт тебе хотелось бы сделать, можно попробовать ее реализовать. Разумеется с соблюдением всех лучших практик.

>>1075151

нужна привязка к краям строки (^ и $)

Также, ты написал (0-9) что значит цифра 0, за ней идет минус, за ним цифра 9. Ты перепутал круглые скобки (группируют буквы в одно выражение) и квадратные (символьный класс).

Можешь почитать мануал http://php.net/manual/ru/pcre.pattern.php

>>1075232

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

>>1075611

Думаю, речь об этих плагинах, хотя не уверен: https://dev.mysql.com/doc/refman/5.7/en/authentication-plugins.html

Тут еще есть ответ по теме: https://stackoverflow.com/questions/33991228/what-is-the-default-root-pasword-for-mysql-5-7/33991229#33991229

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

Вообще, в линуксе обычно программы исопльзуют системную таблицу пользователей, а не свою (как mysql). Ну например, постгрес по умолчанию логинится под текущим пользователем ОС.

"правильнее" наверно было бы разобраться, как это работает.

Если ты используешь phpMyAdmin, проверь, что он не доступен снаружи. Были раньше случаи, когда там находили дыры, и я бы не стал его выставлять в интернет вообще. Ну или хотя бы закрыл HTTP авторизацией, доверия к его коду у меня нету. И защиты от подбора паролей там по моему тоже нет.
Ответы: >>1082173
Аноним 2017/10/24 15:43:42  №1081172 15
http://prntscr.com/h1d95t
а зачем и как завершать скрипт? мы же все равно выше редирект делаем.
Ответы: >>1082548
someApprentice 2017/10/26 05:48:01  №1082173 16
>>1079886
>Также, у тебя нет обработки ошибок, а промисы по умолчанию "съедают" ошибки, и ты о них может быть не узнаешь (точнее, узнаешь, если поставишь обработчик unhandledPromise или как-то так).
У меня есть обработка ошибок в готовом черновом коде, но она идёт немного запутанным способом

https://github.com/someApprentice/chat/blob/master/public/js/conversation.js#L62

Ошибка отправляется назад в backend. Я это исправлю в скоре.

>unhandledPromise
Я не совсем понял что это такое, это когда ошибку обрабатывают внутри экзекьютора Общеания?

var promise = new Promise(function (resolve, reject) {
if (something) {
resolve();
} else {
//unhandledPromise
reject();
}
});


>У меня тут нет кода обработки ошибок - ошибок получения сообщений и ошибок расшифровки. Это уже ты должен смотреть по логике приложения, как ошибки должны обрабатываться.
Я впервые пишу приложение на js и впервые работаю с его библеотеками, и у меня ещё большая путаница в голове с Обещаниями. Можно подсказку как узнавать что ошибка произошла? То есть например, в случае с ajax мы на вход функции onRejected отправляем jqXHR и textStatus. Насколько я понимаю, они (аргументы функции) появляются в самом коде метода ajax и возвращаются с помощью Promise.reject(jqXHR, textStatus), я правильно понимаю? Из чего следует, что подробности об ошибке Обещания нужно искать в самом коде приложения. Это так?

>Также, тут есть недостаток. Расшифровка сообщений - асинхронная, но тут мы ждем, пока они не расшифруются все. Можно написать более продвинутую версию кода:
>decryptedPromise.done(function (decrypted) {
>.done()
У стандартного ES6 класса Promise нету метода .done().

>Здесь мы видим громоздкую тяжелочитаемую конструкцию, а это верный признак проблемы, которая решается "добавлением еще одной абстракции". Попробуем применить тут реактивное программирование. Я напомню, что там есть объект Observable, который представляет собой поток каких-то событий. У нас будет 2 потока: поток, в который прибывают зашифрованные сообщения, и поток, в который приходя расшифрованные сообщения.
Я ещё только ознакамливаюсь с паттерном Observable и реактивным порграммированием. У меня в совокупности с вашими замечаниями ( https://gist.github.com/codedokode/6dfde1f0ec3d895bc940b67e7919cc29 ), в которых вы упоминали об этом, есть к этому вопросы, которые я задам после того как напишу приложение без модели. Причина по которой я хочу написать приложение без модели, это потому, что я хочу на собственом опыте хочу понять в чём разница между приложением с моделью и приложением с ней.

>>1080119
>Думаю, речь об этих плагинах, хотя не уверен: https://dev.mysql.com/doc/refman/5.7/en/authentication-plugins.html
Я должен оговориться, что в Debian stretch заместо mysql идёт MariaDB. Я не знаю как теперь у mysql с этим обстоят дела. Наверно, нужно проверить.

>Если ты используешь phpMyAdmin, проверь, что он не доступен снаружи. Были раньше случаи, когда там находили дыры, и я бы не стал его выставлять в интернет вообще. Ну или хотя бы закрыл HTTP авторизацией, доверия к его коду у меня нету. И защиты от подбора паролей там по моему тоже нет.
Я не пользуюсь им, потому что мне кажется что такого рода приложения говорят о некомпетенции программиста, потому что доступ к mysql можно получить и через консоль. То что вы тоже не доверияте ему говорит о том, что моя интуиция мне подсказывает правильно.
Ответы: >>1082548
Аноним 2017/10/27 01:04:57  №1082548 17
>>1081172

die(), exit(), может быть return - зависит от того, как твой скрипт написан.

>>1082173

Насчет обработки ошибок - я что-то сам пока не представляю, как лучше сделать. Тут можно использовать разные подходы:

- можно попробовать сделать функции, которые в принципе не возвращают ошибку, а пытаются провести операцию повторно (можно с увеличивающимся интервалом). Только тут надо предусмотреть отмену операции, а то может накопиться много таких "вечных" операций.
- можно попробовать сделать централизованный обработчик, и прикрутить к нему индикатор ошибки в интерфейсе (который будет показывать что есть проблемы со связью, или что сейчас выполняется запрос). Ну например, если у нас есть модуль работы с API то мы можем в нем это и реализовать.
- также, в случае мессенджера можно около сообщения показывать его статус (отпраляется - отправлено - невозможно отправить)

То есть тут надо сначала решить, что мы делаем при ошибках, что делаем с интерфейсом, а только потом проектировать код.

> У меня есть обработка ошибок
Вместо объекта результата jQuery, лучше наверно стандартный промис возвращать.

>>unhandledPromise
> Я не совсем понял что это такое, это когда ошибку обрабатывают внутри экзекьютора Общеания?
Не, это событие https://developer.mozilla.org/en-US/docs/Web/Events/unhandledrejection

У window есть событие error, которое происходит при непойманном исключении. Если в промисе произошло reject и оно не было обработано, то сработает событие unhandledrejection. Можно с его помощью централизованно собирать ошибки. Но проблема конечно в том, что это ловит глобально все ошибки, не позволяя например ловить их только в рамках одного класса. И в ФФ судя по MDN не работает. Обработка ошибок в промисах (по моему личному мнению) сделана неудачно.

Интересная особенность промисов в том, что ты при ошибке не можешь даже выбросить исключение, так как оно снова будет поймано:

var x = getMessages().then(null, function (error) {
// исключение перехватится и будет возвращено внутри промиса x
throw new Error(error);
});

> То есть например, в случае с ajax мы на вход функции onRejected отправляем jqXHR и textStatus.
Если произойдет ошибка, то jQuery вызовет onRejected, верно.

> Насколько я понимаю, они (аргументы функции) появляются в самом коде метода ajax и возвращаются с помощью Promise.reject(jqXHR, textStatus), я правильно понимаю?
Нет, в коде ошибка, в reject информация об ошибке передается одним аргументом-исключением:

reject(new RequestError(textStatus));

> Из чего следует, что подробности об ошибке Обещания нужно искать в самом коде приложения. Это так?
Где обрабатывать ошибку, зависит от того, что ты хочешь делать при ошибке.

> У стандартного ES6 класса Promise нету метода .done().
Это я наверно из PHP взял. Тогда then().

> я хочу на собственом опыте хочу понять в чём разница между приложением с моделью и приложением с ней.
Ок

> в Debian stretch заместо mysql идёт MariaDB.
Так это форк mysql (как и percona), и я думаю, там процентов на 95 тот же самый код.

> мне кажется что такого рода приложения говорят о некомпетенции программиста
Ну я бы не был столь категоричен, в GUI в принципе тоже есть свои преимущества (например, таблицы можно выводить более качественно, особенно большие, прокрутка лучше реализуется). Веб-интерфейс конечно имеет свои недостатки - например, нельзя отменить долго выполняющийся запрос (а в консоли можно через Ctrl + C). Но есть и другие GUI клиенты, и в принципе, если кому-то нравится ими пользоваться, почему бы и нет. Там например можно сохранять часто выполняемые запросы, можно редактировать таблицы визуально и тд.
Ответы: >>1083110 >>1083114
Аноним 2017/10/28 01:11:44  №1083067 18
Замена одного слова на другое
https://ideone.com/Rivr5w
последний пример - чистейшая удача окончание а
Ответы: >>1085269 >>1085261
someApprentice 2017/10/28 07:39:01  №1083110 19
>>1082548
>> Из чего следует, что подробности об ошибке Обещания нужно искать в самом коде приложения. Это так?
>Где обрабатывать ошибку, зависит от того, что ты хочешь делать при ошибке.
Как вы говорили, мне нужно обработать ошибку дешифровки. Например, может быть передан неправильный passphrase. Изучив код библиотеки я выяснил, что, при дешифровке ключа, метод Key.prototype.decrypt(...) возвращает false, если ключевое слово не подошло.

https://openpgpjs.org/openpgpjs/doc/key.js.html#line389

И после этого, при получении сообщений, я проверяю этот метод перед дешифровкой

https://github.com/someApprentice/chat/blob/master/public/js/conversation.js#L284
https://github.com/someApprentice/chat/blob/master/public/js/crypter.js#L11-L21

Здесь всё понятно, потому что нету никаких Обещаний.

А вот в сам метод дешифровки завязан на Обещании, и мне до сих пор не понятно как оно работает
Вот его код https://openpgpjs.org/openpgpjs/doc/message.js.html#line95

>return Promise.resolve()...
Означает вернуть выполненное обещание с пустым значением

Зачем делать пустое обещание? И зачем дожидаться его выполнения, если мы уже вернули выполненное обещание, которое должно произойти мгновенно?

>...then(
и когда оно выполниться выполнить функцию, которая

Сначала проверит ключ сессии что это может быть? и если он неверен выбросит ошибку

Затем отфилтрует какие-то пакеты

И если ни одного из них ни найдено вернет false (null?)

Затем возмёт первый попавшейся пакет
И с его помощью асинхронно выполнит рашифровку

https://openpgpjs.org/openpgpjs/doc/packet_symmetrically_encrypted.js.html#line66
https://openpgpjs.org/openpgpjs/doc/packet_sym_encrypted_integrity_protected.js.html#line113
symEncryptedAEADProtected не нашел

Метды выше выполняют какой-то алгоритм дешифровки, выбрасывают исключения если что-то не получилось и опять возвращают выполненное обещание с пустым значением return Promise.resolve(). Причём, когда происходит ошибка не возвращается Promise.reject(new Error(...)). Я не понимаю как это работает.
Вы поэтому упоминули про unhandledRejection? Его нужно где-то повесить?

Если абстрогироваться от всего этого запутанного кода, можно разделить ошибки на:

- передан неправильный шифр сообщения
- передан неправильный ключ
- передана неверная ключивая фраза
- ключ не подходит к данному шифру

var privateKey = '-----BEGIN PGP PRIVATE KEY BLOCK ... END PGP PRIVATE KEY BLOCK-----';
var encrypted = '-----BEGIN PGP MESSAGE ... END PGP MESSAGE-----';

// Если ключ неправильный, то вбрасываются ошибки
// https://openpgpjs.org/openpgpjs/doc/key.js.html#line1030
// https://openpgpjs.org/openpgpjs/doc/key.js.html#line1036
privateKey = openpgp.key.readArmored(privateKey).keys[0];

// Если ключевая фраза не подошла, то просто вернётся false
var success = privateKey.decrypt(this.passphrase);

if (success) {
var options = {
// Если шифр неверен, опять же, вбрасываются ошибки
// https://openpgpjs.org/openpgpjs/doc/encoding_armor.js.html#line285
// https://openpgpjs.org/openpgpjs/doc/encoding_armor.js.html#line337
message: openpgp.message.readArmored(encrypted),
privateKey: privateKey
};

// Вешаем unhandledRejection
window.addEventListener("unhandledrejection", function (e) {
console.log(e.reason);
});

// Если ключ не подходит, то ошибка должна произойти где-то здесь и пойматься в unhandledRejection
var promise = openpgp.decrypt(options).then(function(decrypted) {
return decrypted;
});
}

>>>unhandledPromise
>> Я не совсем понял что это такое, это когда ошибку обрабатывают внутри экзекьютора Общеания?
>Не, это событие https://developer.mozilla.org/en-US/docs/Web/Events/unhandledrejection
>
>У window есть событие error, которое происходит при непойманном исключении. Если в промисе произошло reject и оно не было обработано, то сработает событие unhandledrejection. Можно с его помощью централизованно собирать ошибки. Но проблема конечно в том, что это ловит глобально все ошибки, не позволяя например ловить их только в рамках одного класса. И в ФФ судя по MDN не работает. Обработка ошибок в промисах (по моему личному мнению) сделана неудачно.
>
>Интересная особенность промисов в том, что ты при ошибке не можешь даже выбросить исключение, так как оно снова будет поймано:
>
>var x = getMessages().then(null, function (error) {
>// исключение перехватится и будет возвращено внутри промиса x
>throw new Error(error);
>});

>Если в промисе произошло reject и оно не было обработано, то сработает событие unhandledrejection.
Т.е. в случае если не был повешан .then(..., onRejected) или .catch(onRejected)?

Я не понимаю, в коде библиотеки не происходит reject, а просто вбрасываются исключения внутри then(), как будто это синхронный код. Эти ошибки получаются идут в результат обешания. Мне нужно сделать что-то вроде

var promise = openpgp.decrypt(options).then(function(decrypted) {
if (decrypted instanceof Error) {
console.log(decrypted.reason)
} else {
return decrypted;
}
});

?

Надо спросить у авторов библиотеки почему они не делают reject?

>Можно с его помощью централизованно собирать ошибки.
А можно небольшой пример как это делается?

>И в ФФ судя по MDN не работает.
Не совсем понял, что именно не работает?

>> У стандартного ES6 класса Promise нету метода .done().
>Это я наверно из PHP взял. Тогда then().
Тогда обещания выполняться асинхронно и сообщения могут быть в не правильном порядке. Но вашу идею я понял.


>> я хочу на собственом опыте хочу понять в чём разница между приложением с моделью и приложением с ней.
>Ок
Я опечатался. Какой стыд.

разница между приложением с моделью и приложенеем без неё*
Ответы: >>1083114 >>1085269 >>1085268
Аноним 2017/10/31 23:56:56  №1085261 20
>>1083067

> \\W*?
В самом начале и в самом конце это можно не писать

> *?
Здесь вопрос работает не так, как ты думаешь. Квантификаторы (плюс, звездочка, {N} и тд) нельзя ставить друг после друга (только если взять часть выражения в круглые скобки). Знак вопроса здесь влияет на "жадность" звездочки - мануал http://php.net/manual/ru/regexp.reference.repetition.php

Если ты не знал про это, то лучше исправить.

В остальном верно.
Ответы: >>1085269
Аноним 2017/11/01 00:15:34  №1085269 21
Этот тред закрыт. Не пишите здесь, а идите в новый тред >>1082507 (OP)

>>1083067

Ответ в новом треде >>1085261

>>1083110

Ответ в новом треде.