Size: a a a

NestJS — русскоязычное сообщество

2021 January 29

D

Dmitriy in NestJS — русскоязычное сообщество
Sergey Shumchenko
const result = await this.authorRepository.createQueryBuilder('author').innerJoinAndSelect("author.posts", "post").where("user.id = :id", {id)).getMany()

А чем плохо данное решение? Можно еще прикрепить пагинацию при необходимости
Да ничем, можно и так
источник

D

Dmitriy in NestJS — русскоязычное сообщество
Sergey Shumchenko
const result = await this.authorRepository.createQueryBuilder('author').innerJoinAndSelect("author.posts", "post").where("user.id = :id", {id)).getMany()

А чем плохо данное решение? Можно еще прикрепить пагинацию при необходимости
Хотя погоди, я сначала не понял, на что ты ответил)) Этот запрос не подойдёт же
источник

D

Dmitriy in NestJS — русскоязычное сообщество
Пагинатор точно будет неправильно работать
источник

D

Dmitriy in NestJS — русскоязычное сообщество
Точнее не так. Если тебе нужны посты строго одного автора, то будет работать нормально - это да. Но если тебе нужно вывести, скажем, 10 авторов и все их статьи одновременно, то так не прокатит, потому что если ты сделаешь limit 10, то этот limit будет применён к результатам, а не авторам. То есть если у первого автора окажется 100 статей, то ты увидишь что-то типа такого:
Пупкин - Статья 1
Пупкин - Статья 2
Пупкин - Статья 3
Пупкин - Статья 4
Пупкин - Статья 5
Пупкин - Статья 6
Пупкин - Статья 7
Пупкин - Статья 8
Пупкин - Статья 9
Пупкин - Статья 10
источник

SS

Sergey Shumchenko in NestJS — русскоязычное сообщество
Dmitriy
Точнее не так. Если тебе нужны посты строго одного автора, то будет работать нормально - это да. Но если тебе нужно вывести, скажем, 10 авторов и все их статьи одновременно, то так не прокатит, потому что если ты сделаешь limit 10, то этот limit будет применён к результатам, а не авторам. То есть если у первого автора окажется 100 статей, то ты увидишь что-то типа такого:
Пупкин - Статья 1
Пупкин - Статья 2
Пупкин - Статья 3
Пупкин - Статья 4
Пупкин - Статья 5
Пупкин - Статья 6
Пупкин - Статья 7
Пупкин - Статья 8
Пупкин - Статья 9
Пупкин - Статья 10
Тогда 2 запроса.
А кстати, разве через select-query-builder не выйдет сделать 2 запроса? Первый на получение юзеров с лимитом и возвратом массива юзеров и второй с подставлением айдишников массива в IN? И потом все сгруппировать в массив и вернуть на фронт
источник

SS

Sergey Shumchenko in NestJS — русскоязычное сообщество
Авторов*)
источник

D

Dmitriy in NestJS — русскоязычное сообщество
Sergey Shumchenko
Тогда 2 запроса.
А кстати, разве через select-query-builder не выйдет сделать 2 запроса? Первый на получение юзеров с лимитом и возвратом массива юзеров и второй с подставлением айдишников массива в IN? И потом все сгруппировать в массив и вернуть на фронт
2 запроса квери-билдером - без проблем. Я имел в виду, что если включить какой-нибудь lazy loading для связей, то о хорошей производительности говорить не придётся, т.к.  будут кучи лишних запросов к базе
источник

VS

Vlad 🦠 Starkovsky in NestJS — русскоязычное сообщество
Друзья подскажите, нестовский сваггер в продакшене это норма? Или принято его только на стейдже/дев держать?
источник

GD

Goncharenko Dmitry in NestJS — русскоязычное сообщество
Привет, я не могу понять в каком месте у меня связывается  strategy с guard? То есть у меня есть стандартная jwt стратегия и гуард, работает норм, теперь я хочу сделать новый гуард с другим сикретом и не вижу как подвязать. Кто может разъяснить малёхо
источник

GD

Goncharenko Dmitry in NestJS — русскоязычное сообщество
У меня есть JwtAuthGuard (jwt.guard.ts)
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {}


Ещё есть JwtStrategy (jwt.strategy.ts):
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
 constructor() {
   super({
     jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
     ignoreExpiration: false,
     secretOrKey: process.env.SECRET,
   });
 }

 async validate(payload: any) {
   console.log('validate', payload);
   const { userId, role } = payload;
   return { userId, role };
 }
}


И накидываю декоратор @UseGuard(JwtAuthGuard)

Всё норм работает.

Теперт хочу сделать новый гуард для отдельных эндпоинтов. Делаю:
@UseGuard(ResetGuard)

Что мне для этого нужно делать, зеркально повторить пример выше - не работает так. Не понимаю где происходит связка JwtAuthGuard с JwtStrategy, за счёт чего?
источник

GD

Goncharenko Dmitry in NestJS — русскоязычное сообщество
Goncharenko Dmitry
У меня есть JwtAuthGuard (jwt.guard.ts)
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {}


Ещё есть JwtStrategy (jwt.strategy.ts):
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
 constructor() {
   super({
     jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
     ignoreExpiration: false,
     secretOrKey: process.env.SECRET,
   });
 }

 async validate(payload: any) {
   console.log('validate', payload);
   const { userId, role } = payload;
   return { userId, role };
 }
}


И накидываю декоратор @UseGuard(JwtAuthGuard)

Всё норм работает.

Теперт хочу сделать новый гуард для отдельных эндпоинтов. Делаю:
@UseGuard(ResetGuard)

Что мне для этого нужно делать, зеркально повторить пример выше - не работает так. Не понимаю где происходит связка JwtAuthGuard с JwtStrategy, за счёт чего?
Ура в доках нашёл одну строчку, которая спасла мою жизнь:
When implementing a strategy, you can provide a name for it by passing a second argument to the PassportStrategy function. If you don't do this, each strategy will have a default name (e.g., 'jwt' for jwt-strategy): export class JwtStrategy extends PassportStrategy(Strategy, 'myjwt')
источник

E

Envy in NestJS — русскоязычное сообщество
Всем привет, кто-то готовил nest/graphql с auth guard?
когда локально гоняю, то всё ок, он на подписку авторизуется, когда на дев серваке, где юзается нжинкс, то нет.

Из отличительных черт увидел, что когда локально это делаю, соединение приходит в объекте req, на сервере в объекте connection

в app.module.ts есть необходимые штуки, а-ля:
installSubscriptionHandlers: true,
     context: ({ req, connection }) => {
       if (connection) {
         return { req: { headers: connection.context } };
       } else {
         return { req };
       }
     },
источник

E

Envy in NestJS — русскоязычное сообщество
проблема была в том, что заголовок уходил, как Authorization, а надо было authorization
источник

E

Envy in NestJS — русскоязычное сообщество
ес что, используется passport-jwt
источник

Д

Дмитрий in NestJS — русскоязычное сообщество
Envy
ес что, используется passport-jwt
источник

АС

Алексей Скороход... in NestJS — русскоязычное сообщество
Окей, а что тогда использовать?)
источник

Д

Дмитрий in NestJS — русскоязычное сообщество
Алексей Скороход
Окей, а что тогда использовать?)
Хз, с нодой толком не работал)
источник

АС

Алексей Скороход... in NestJS — русскоязычное сообщество
Честно говоря, альтернативы токенам я не вижу, возможно секьюрность слабовата, но удобно очень
источник

Д

Дмитрий in NestJS — русскоязычное сообщество
Алексей Скороход
Честно говоря, альтернативы токенам я не вижу, возможно секьюрность слабовата, но удобно очень
OAuth должен же подойти на замену, не? 🌚
источник

АС

Алексей Скороход... in NestJS — русскоязычное сообщество
Дмитрий
OAuth должен же подойти на замену, не? 🌚
Круто конечно, но токены удобнее)))
источник