• Как избавиться от предупреждения?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Нельзя использовать строки как ключи, это рано или поздно приведёт к конфликтам по названиям.
    При проверке ключа на соответствие библиотека context сравнивает значение и тип ключа.
    Ключ не должен быть простого типа, типа string, int и т.д.
    Нужно создавать отдельный тип для ключа.
    Такой подход позволит вам иметь в контексте несколько значений с одинаковым ключём, но разного типа.

    Вот пример как правильно сделать:
    type contextKey uint
    
    const (
        UserIDContextKey contextKey = 1
    )
    ...
    ctx := r.Context()
    ctx = context.WithValue(ctx, UserIDContextKey, tk.UserID)
    Ответ написан
    Комментировать
  • Как записать несколько файлов в одно поле?

    notiv-nt
    @notiv-nt
    Как ваше ничего? Да, моё тоже
    formData.append("photo[]", fs.createReadStream("./photo.jpg"))
    Ответ написан
    Комментировать
  • Как описать структуру входных данных?

    @ghostiam
    На Go писатель, серверов пинатель.
    resp.Body содержит только байты и ничего более.

    Вы можете в зависимости от статуса ответа сервера resp.Status, выбирать, как вам обрабатывать данные.
    Например, у меня в проектах сделано так:
    Когда статус запроса 200, я декодирую его как обычно.
    Если статус другой, я ожидаю, что он будет содержать другую структуру, в которой будет описание ошибки и пытаюсь его декодировать в эту структуру и возвращаю как ошибку.
    Но если декодирование ошибки не удалось, то я просто возвращаю ошибку, содержащую текст Body.
    Ответ написан
    Комментировать
  • Как динамически изменять размеры блока?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Нет такого атрибута - transform. Это должно быть свойство style:

    :style="{ transform: computedMatrix }"
    Ответ написан
    Комментировать
  • Как к дате time.Now() прибавить 1 час??

    tumbler
    @tumbler
    бекенд-разработчик на python
    Ответ написан
    Комментировать
  • Как вернуть результат или ошибку?

    @ghostiam
    На Go писатель, серверов пинатель.
    Чтобы вернуть nil, нужно чтобы тип был ссылочным
    func Start() (*RestResponse, error)

    либо вы можете вернуть ошибку так:
    if err != nil {
      return RestResponse{}, err
    }
    Ответ написан
    4 комментария
  • Как указать тип объекта?

    @StockholmSyndrome
    interface ISport {
        id: number,
        parentId: number,
        name: string,
    }
    
    const sports: ISport[] = ...;
    
    
    interface ISportsMap {
        [x: number]: ISport;
    }
    
    const sportsMap: ISportsMap = {}
    for (let i = 0, len = sports.length; i < len; i++) {
        sportsMap[sports[i]["id"]] = sports[i]
    }
    Ответ написан
    Комментировать
  • Как объединить два объекта без затирания вложенных свойств?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Не полениться обходить каждое свойство, и если его значение это объект, то рекурсивно не полениться обходить...

    Простых-встроенных методов пока нет.

    Например, см. реализцию _.merge() в библиотеке lodash.
    Ответ написан
    Комментировать
  • Как правильно использовать интерцепторы в axios?

    owl1n
    @owl1n
    fullstack developer
    Покажу немного практик, как интерцепторы упрощают жизнь мне, да и многим, в целом.
    Здесь и далее покажу именно использование интерцепторов при работе с авторизацией по JWT (токены).

    1) Подстановка хедера авторизации

    const createSetAuthInterceptor = options => config => {
      if (options.access) {
        config.headers.Authorization = options.access;
      } else {
        delete config.headers.Authorization;
      }
      return config;
    };
    
    const setAuthCb = createSetAuthInterceptor(store.state.auth);
    axios.interceptors.request.use(setAuthCb);


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

    2) Следующая практика, это обновление токена (то, о чем вы спросили в комментарии, при окончании сессии и т.д.)

    let refreshTokenPromise;
    
    const createUpdateAuthInterceptor = (store, http) => async error => {
      const message = get(error, 'response.data.message');
      if (!['Token expired', 'Invalid token'].includes(message)) {
        return Promise.reject(error);
      }
    
      if (!refreshTokenPromise) {
        refreshTokenPromise = store.dispatch('refreshToken');
      }
    
      await refreshTokenPromise;
      refreshTokenPromise = null;
    
      return http(error.config);
    };
    
    const updateAuthCb = createUpdateAuthInterceptor(store, axios);
    axios.interceptors.response.use(null, updateAuthCb);


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

    В этом же решение, вместо обновления токена, можно отправлять юзера авторизовываться самому, на страницу авторизации. Для этого, конечно же, стоит передавать не экземпляр store, а экземляр роутера, чтобы редиректить юзера. Надеюсь, помог и хоть как то наглядно показал способы применения :)
    Ответ написан
    1 комментарий
  • Как обрабатывать код 400 и 401?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Тоже сталкивался с этим.
    Я, помнится, в своё время сразу внимательно перечитал страницу проекта на гитхабе.
    И там, внезапно, нашлось, то что нужно. https://github.com/axios/axios#handling-errors

    Попробуйте тоже в будущем почитывать документацию ;)
    Ответ написан
    Комментировать
  • Как инициаизировать пустую переменную?

    Robur
    @Robur
    Знаю больше чем это необходимо
    let client
    // ....
    client = ...


    client будет того типа что в него присвоили.

    Но судя по всему у вас client это свойство класса - для него надо либо инициализировать в конструкторе, или писать | undefined, потому что там и правда может быть undefined

    Если вы стопудово уверены что до любого использования в классе client будет инициализирован то
    client!: sheets_v4.Sheets
    тут вы берете ответственность на себя и если все развалится и упадет потому что там будет undefined - тайпскрипт не виноват.
    Ответ написан
    Комментировать
  • Как инициаизировать пустую переменную?

    @abberati
    frontend-разработчик
    Ну так у вас в переменной лежит либо какой-то тип, либо юнион из этого типа и undefined. Инициализируйте сразу значением. Если это невозможно, то придётся делать проверки, на то она и строгая статическая типизация.
    Ответ написан
    Комментировать
  • Как динамически изменять значение атрибута?

    @AndrewRusinas
    :transform="matrix"

    Upd: поторопился.

    можно вот так:

    computed: {
      computedMatrix() => `matrix(${this.matrix.a}, ..., ..., ...)`
    }
    
    :transform="computedMatrix"
    Ответ написан
    Комментировать
  • В чём отличие zoom от scale?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    У CSS-трансформаций есть такая штука, как transform-origin. В вашем примере эта точка находится по умолчанию в центре элемента. А у нестандартного свойства zoom аналогичная точка по умолчанию в левом верхнем углу элемента. Добавьте вашему workspace transform-origin: 0 0; и поведение станет схожим.
    Ответ написан
    Комментировать
  • Как отправить структурированный запрос к google sheets api?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    зайдите с тыла

    т.е. АПИ другое, но sheet в качестве источника
    Ответ написан
    Комментировать
  • Как улучшить упаковку запросов?

    @StockholmSyndrome
    resolve(response[i][0]);

    зачем [0]? упаковка запросов может использоваться для любых методов, где структура ответа может быть не массивом

    можно добавить обработку ошибок
    если в ответе false, то метод вернул ошибку, которая помещается в массив объектов execute_errors, то есть можно написать что-то такое:
    const { response, execute_errors } = await request(code);
    
    for (let i = 0, len = response.length; i < len; i++) {
      const { resolve, reject } = queuePart[i];
      if (response[i] === false) {
        reject(execute_errors.shift());
      } else {
        resolve(response[i]);
      }
    };

    но при этом request должен возвращать полный ответ от метода execute, а не только поле response
    Ответ написан
    Комментировать
  • Как сделать проброс портов в nginx?

    chupasaurus
    @chupasaurus
    Сею рефлекторное, злое, временное
    Если хочется чистый проброс портов, то модуль stream_proxy в помощь.
    Ответ написан
    Комментировать
  • Как сделать проброс портов в nginx?

    antoo
    @antoo
    Возможно как-то так?
    location ~ "/port/(\d+)" {
            proxy_pass http://127.0.0.1:$1/;
    }
    Ответ написан
    1 комментарий
  • Как реализовать экспорт модуля после выполнения асинхронной функции?

    @FabiBoom
    Промис экспортировать можно

    module.exports = async function() {
          const exportFunctions = {};
           //  код
    
          // добавляем функции нужные
          exportFunctions.sheet = sheet;
           
          return exportFunctions;
       };
    
      // другой файл
    
      const mod = require('./test.js').then(funcs => console.log(funcs)); // наши функции
    Ответ написан
    3 комментария
  • Как реализовать правильное изменение свойства translate?

    0xD34F
    @0xD34F Куратор тега JavaScript
    При движении вверх или влево координаты искажаются.

    Это потому что отрицательный translate, вы минус не учитываете, когда регулярным выражением достаёте значения.

    https://jsfiddle.net/46vfg79L/
    Ответ написан
    Комментировать