• Почему теряется контекст экземпляра класса?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Потому что он используется как мидлваре.
    Вызывайте его привязывая контент, както так

    const Authorized = require('../moduls/authorized')
    const auth = new Authorized();
    
    
    // так
    router.get("path/",auth.isAuthorized.bind(auth));
    // или так
    router.get("path/",(...a)=>auth.isAuthorized(...a));

    и еще кучей способов

    вот, можете почитать про Привязка контекста к функции

    а еще лучше измените метод isAuthorized примерно так:
    isAuthorized(){
       return (req, res, next)=>{
          console.log('isAuth',this)
          // тут код мидлвара
      }
    }


    и используйте его так
    router.get("path/",auth.isAuthorized());
    // или
    router.post("path/",auth.isAuthorized());
    // или
    router.use(auth.isAuthorized());
    Ответ написан
    1 комментарий
  • Как взять весь объект, но менять у него только одно свойство?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Нет уверенности что я правильно понял вопрос, но могу предложить такой вариант:
    const obj = {
      sv1 : 'a',
      sv2: 'b',
      sv3: 'c'
    }
    
    if( obj.hasOwnProperty("sv") ) obj.sv = 'z';
    
    const arr = [obj];


    если все же понял не верно, то опишите суть подробнее.
    Ответ написан
    Комментировать
  • Как создать сессию?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    как показано в описании client-sessions помимо опции secret надо задать еще ряд опций, таких как cookieName (она же имя сессии) либо requestKey (requestKey overrides cookieName for the key name added to the request object).
    что позволит обращаться к сесcии через req

    ваш пример с исправлениями ошибок
    const express = require('express'),
        app = express(),
        port = 3000,
        clientSessions = require('client-sessions');
    
    app.use(clientSessions({
        secret: '0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK', // set this to a long random string!
        cookieName: 'ss', // cookie name dictates the key name added to the request object
        requestKey: 'session', // requestKey overrides cookieName for the key name added to the request object.
    }));
    
    app.get('/',(request,response,next) => {
        request.session.username = 'qwer';
        response.send("вы обратились к /");
    });
    
    app.get('/1',(request,response,next) => {
        console.log(request.session.username);
        response.send("вы обратились к /1<br>в сессии сохранено: "+JSON.stringify(request.session));
    });
    
    app.listen(port,(err) => {
        if(err){
            return console.log(err);
        }
    
        console.log(`Слушается порт ${port}`);
    });


    PS: и не забывайте вызывать next(); там где требуется передать управление следующему обработчику или же request.end() или request.send(...) там где требуется прекратить дальнейшую обработку запроса

    PSPS: и пожалуйста, напишите в чем у вас возникли проблемы с ранее предложенным решением или отметьте его решением.
    Ответ написан
    Комментировать
  • Как сбросить запрос на сервер?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    ...
    document.querySelector('#translate_btn').addEventListener('click', function(){
      var word = document.getElementById("translate_form"); //поле ввода слова
    
      // добавьте эти две  строчки!!!!!
      if( !word.value ) return;
      url = 'https://translate.yandex.net/api/v1.5/tr.json/translate';
    
    
      var langTranslate = document.querySelector('.lang_list');//выбор языка перевода
      var translate = document.querySelector('.translate');//блок, куда вставляется перевод
      var translate = document.querySelector('.translate');//блок, куда вставляется перевод
      var req = new XMLHttpRequest();
    
    ...
    Ответ написан
    Комментировать
  • Как передать переменную в анонимную функцию?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    var button = document.getElementsByName('but');
    for(let i = 0; i < button.length; i++) {
       button[i].addEventListener('change', function() {        
          document.getElementById('aaa').innerHTML = 
          button[i].value;
       });
    }
    Ответ написан
    Комментировать
  • Запутался в замыкании + обертка, разбермся?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Тут все просто:
    ...
    
    function delay(func, timeOut) {
        // при вызове delay(func, timeOut) мы создаем анонимную функцию и возвращаем ее
        // но при этом внутри нее мы обращаемся к переданному параметру func 
        // создавая тем самым замыкание на него
        return function() {
            // внутри возвращаемой анонимной функции мы запускаем таймер
            // которому передаем параметр func являющейся функцией, определенной 
            // где то вовне этот таймер выполнит func но при этом внутри самой func 
            // уже будет не видны параметры переданные для анонимной функции. 
            // Внутри анонимной функции эти параметры можно получить через arguments.
            // Тля того, чтобы func могла получить к ним доступ, мы используем apply, 
            // привязывая к func контент вызова анонимной функции и ее arguments
            // тем самым создавая замыкания к this и arguments анонимной функции
            setTimeout(func.apply(this, arguments), timeOut);
            // как правильно подсказал @bingo347, эту строчку надо немного переписать
            setTimeout(func.bind(this, ...arguments), timeOut);
        }
    }
    
    // примерно того же эффекта можно было добиться следующим кодом
    function delay(func, timeOut) {
        return function(text) {
            setTimeout(()=>func(text), timeOut);
        }
    }
    
    // можно даже добиться не примерно такого, а точно такого же эффекта
    // (за исключением привязки контекста анонимной функции через this
    // который влияет лишь на возможность обратится непосредственно
    // к методам и свойствам самой анонимной функции, которых в вашем
    // примере не объявлено ))) 
    function delay(func, timeOut) {
        return function(...args) {
            setTimeout(()=>func(...args), timeOut);
        }
    }
    ...


    по теме:
    arguments
    apply

    PS: но ваш способ с учетом поправок от Дмитрий Беляев (как и мой второй способ) правильнее, потому что позволяет не переписывая функцию delay делать так:
    function f(argument1, argument2) {
        alert(argument1 + " " + argument2);
    }
    let f1000 = delay(f, 1000);
    f1000("1111", "2222"); // показывает "1111 2222" после 1000 мс


    и так:
    function f(argument1, argument2, argument3) {
        alert(argument1 + " " + argument2 + " " + argument3);
    }
    let f1000 = delay(f, 1000);
    f1000("1111", "2222", "3333"); // показывает "1111 2222 3333" после 1000 мс


    и так далее ))))
    Ответ написан
    1 комментарий
  • Telegram bot Python. Как вычленить юзеров с арабскими символами в имени?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    вот регулярка, срабатывающая на наличие арабских символов:

    /\u0621-\u064A/

    соответственно проверка строки на наличие арабских символов будет выглядеть как то так:
    import re
    ...
    pattern = re.compile('\u0621-\u064A')
    result = pattern.search('ваша проверяемая строка')
    
    if result is not None:
          print('есть арабские символы')
    else:
          print('арабских символов нет')
    ...
    Ответ написан
    Комментировать
  • Почему touchmove несколько раз выполняет функцию?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Так происходит потому, что вы при каждом выполнении события явно или неявно снова вешаете обработчик события touchmove. Покажите ваш код (место где вы вешаете обработчик и сам обработчик)
    Ответ написан
    5 комментариев
  • Как найти арифметическую прогрессию в списке?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    к сожалению python не мой рабочий инструмент, поэтому сделал реализацию на js. Старался не использовать "особые фишки" языка, чтобы получить более универсальный код (с точки зрения переносимости на другие ЯП). Думаю вы без проблем сможете переписать его на python.

    var arr1 = [1487, 1847, 4817, 4871, 7481, 7841, 8147, 8741];
    var res1 = search(arr1);
    console.log(res1); 
    // найдена 1 прогрессия. выведет:
    // [ 
    //   [ 1487, 4817, 8147 ] 
    // ]
    
    
    
    var arr2 = [1487, 1847, 4817, 4871, 7481, 7841, 8147, 8741, 10001];
    var res2 = search(arr2);
    console.log(res2); 
    // найдено 2 прогрессии. выведет:
    // [ 
    //   [ 1487, 4817, 8147 ],
    //   [ 7481, 8741, 10001 ]
    // ]
    
    
    
    
    
    
    function search(a){
    	// создадим массив, в который будем заносить данные о найденых прогрессиях
    	var result = [];
    
    	// проверяем в цикле все числа
    	for(var start=0; start<a.length; start++){
    		for(var i=start+1; i<a.length; i++){
    
    			// вычисляем предпологаемый шаг прогрессии
    			var step = a[i]-a[start]; 
    
    			// и проверяем его.
    
    			// создаем массив, в который складываем 
    			// числа предполагаемой прогрессии
    			var list = [ a[start], a[i] ]; 
    
    			// смотрим в цикле следующие числа
    			for(var j = i+1; j< a.length; j++){
    				// если следующее число - шаг прогрессии равно
    				// последнему занесенному в массив list
    				// то добавляем его в массив list
    				if( a[j]-step == list[list.length-1]){
    					list.push(a[j]);
    				}
    			}
    
    			// если в массиве 3 элемента или более, то считаем что
    			// еще одна прогрессия найдена и запоминаем ее в
    			// массиве с результатами
    			if( list.length>2){
    				result.push(list);
    			}
    
    			console.log(start, i, step, list)
    		}
    	}
    
    	// возвращаем массив результатов
    	return result;
    }
    Ответ написан
    Комментировать
  • Не работает реализация алгоритма, поможете найти ошибку?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    замените:
    // Скроллим еще ниже
      if(scrollBottom == true){
        //alert("Скроллим вниз");
        objDiv.scrollTop = objDiv.scrollHeight;
      }


    на

    // Скроллим еще ниже
      if(scrollBottom == true){
        //alert("Скроллим вниз");
        setTimeout(()=>{
           objDiv.scrollTop = objDiv.scrollHeight;
        },1000);
      }


    Но это будет ненадежный костыль, по хорошему тут надо все переделать, включая и php/view.php

    Не работало как надо потому, что без сеттаймоута вы сразу после замены сообщений в блоке мессаджес пытаетесь проскролить, но браузер в этот момент еще не отработал вставку (тоесть новые сообщения еще не заменили старые и не изменили высоту прокрутки)

    соответственно с сеттаймоутом вы даете время браузеру отработать вставку сообщений, и на момент когда вы делаете objDiv.scrollTop = objDiv.scrollHeight; в блоке уже новые сообщения.

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

    Вся эта система по сути сейчас работает на багах, я бы советовал задать еще один вопрос о том как правильно сделать данный функционал (как оптимизировать объем передаваемых сообщений и обновление блока с сообщениями)
    Ответ написан
    Комментировать
  • Не работает без Alert, что за магия?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Banan44, ваш вопрос дублирует другой ваш вопрос Не работает реализация алгоритма, поможете найти ошибку?
    Ответ написан
  • Как получить данные из select?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    искать и читать доку вас конечно же не учили?

    Ответ написан
    Комментировать
  • Как сделать такую фильтрацию?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Ответ написан
    Комментировать
  • Как сделать такую кнопку?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Такие кнопки уже давно никто не делает картинками, для этого используют css.
    Это можно делать вручную, а можно и воспользоваться онлайн конструкторами типа этого https://www.css3buttongenerator.com/

    вот небольшой пример:



    я конечно не идеально подобрал цвета, шрифты и размеры, но вы вполне сможете это сделать сами

    ЗЫ: подправил тень
    Ответ написан
    Комментировать
  • Вопрос с собеседования - почему не меняется объект?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    потому что в строке
    let products = obj.data

    вы по сути в products вставляете ссылку на obj.data

    а в строке
    products = []

    вы заменяете эту ссылку на другую

    при этом содержимое
    obj.data
    тоже ссылка, и она остается прежней.

    другими словами: если вы записали на листок телефон своей девушки а потом найдя другую девушку, про старую решили забыть и зачеркнув ее номер написали номер новой девушки то прежня девушка никуда не исчезла? она ведь по прежнему сидит на своем номере телефона и ждет вашего звонка? (в данной ситуации products и есть этот листок с номером ))))

    ЗЫ: был несколько невнимателен, не достиг моего мозга последний абзац вашего вопроса. Ответили вы верно.
    Ответ написан
    2 комментария
  • Можно ли создать музыкальный сайт только на javascript?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Да, это реально. Вам понадобятся backend и frontend. Посмотреть список технологий, используемых в обоих ветках можно тут https://proglib.io/p/webdev-2019/

    Если расписывать все в деталях, то я устану примерно на втором абзаце, и это будет меньше ~10% от того, что вам понадобится)

    ЗЫ: рекомендую начинать с чего нибудь попроще, например напишите для начала свой вариант игры "змейка", естественно с аудиосопровождением, с возможностью мультиплеера и рейтингом)
    Ответ написан
    9 комментариев
  • Как создать картинку онлайн размером 660х440 пикселей + вставить туда текст?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    imagemagik - эсли действия с изображениями планируете производить на бэке (на сервере)
    canvas - эсли хотите делать это на фронте (на клиенте)
    Ответ написан
    6 комментариев
  • Как из плоского объекта с ключами, которые представляют собой несколько ключей склеенных через точку, сделать вложенный объект?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Когда то делал что то подобное . Нужная вам логика в функции parsePermissions

    PS: вот поубирал лишнее и сделал демку (на выходе почти то что вы хотели). в самой функции parsePermissions тоже многое можно поубирать, но тут уж сами немного поработайте))))
    тык
    {
    ᠌ ᠌᠌ ᠌ ᠌ "foo": {
    ᠌ ᠌᠌ ᠌ ᠌ ᠌ ᠌᠌ ᠌ ᠌ "0": {
    ᠌ ᠌᠌ ᠌ ᠌ ᠌ ᠌᠌ ᠌ ᠌ ᠌ ᠌᠌ ᠌ ᠌ "first": 111
    ᠌ ᠌᠌ ᠌ ᠌ ᠌ ᠌᠌ ᠌ ᠌ },
    ᠌ ᠌᠌ ᠌ ᠌ ᠌ ᠌᠌ ᠌ ᠌ "1": {
    ᠌ ᠌᠌ ᠌ ᠌ ᠌ ᠌᠌ ᠌ ᠌ ᠌ ᠌᠌ ᠌ ᠌ "first": 222
    ᠌ ᠌᠌ ᠌ ᠌ ᠌ ᠌᠌ ᠌ ᠌ }
    ᠌ ᠌᠌ ᠌ ᠌ },
    ᠌ ᠌᠌ ᠌ ᠌ "bar": {
    ᠌ ᠌᠌ ᠌ ᠌ ᠌ ᠌᠌ ᠌ ᠌ "second": 333
    ᠌ ᠌᠌ ᠌ ᠌ }
    }





    PPS: и вот еще вариантик, но тоже на стал превращать объекты в массивы)))
    тык

    const insert = (target,path,value) => path.split(".").reduce((a,k,i,l)=>a[k]=i+1==l.length?value:a[k]||{},target);
    
    const parse = (list,result={}) => Object.keys(list).forEach(k=>insert(result,k,list[k]))||result;
    
    const output = parse(input);
    Ответ написан
    Комментировать
  • Как добавить данные в объект из input?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    3 комментария
  • Как вынесли переменную?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Никак не вынесите, но это и не нужно. Вот мой ответ (немного сумбурный) на по сути такой же вопрос. Посмотрите его.
    Как запомнить текст, который выполняется в функции?

    Вот вариант, позволяющий писать код как если бы он был синхронным.
    // так как name.names(...) асинхронный, то для того, чтобы получить 
    // результат запроса в "синхронном стиле" используем await
    
    // await можно использовать только внутри асинхронной функции.
    // для этой цели обернем блок с вызовами name.names(...) в
    // само вызывающуюся асинхронную функцию
    (async () => {
    
       var n = await name.names('text', { data });
       console.log(n);
    
    })()
    Ответ написан
    Комментировать