Size: a a a

NodeUA - JavaScript and Node.js in Ukraine

2019 August 12

TS

Timur Shemsedinov in NodeUA - JavaScript and Node.js in Ukraine
Stephan Nein
Вообщем я понял, что на осваивание базы уйдет около полтора месяца😅
Ну это если как на работу, каждый день и не только слушать, но и пытаться самому написать после лекции примерно подобные штуки, как разбирались
источник

SN

Stephan Nein in NodeUA - JavaScript and Node.js in Ukraine
Timur Shemsedinov
Ну это если как на работу, каждый день и не только слушать, но и пытаться самому написать после лекции примерно подобные штуки, как разбирались
Да, очень удобно слушать и конспектировать👍
источник

АЗ

Александр Златокрыле... in NodeUA - JavaScript and Node.js in Ukraine
Timur Shemsedinov
можно использовать в тестах фейковый логин и пароль
Нашлось решение:  I.fillField('#password', secret(password));
источник
2019 August 13

V

Victor in NodeUA - JavaScript and Node.js in Ukraine
Переслано от Victor
https://nodejs.org/api/events.html#events_emitter_removealllisteners_eventname что произойдет если вызвать это без параметров? в доке не сказано
источник

V

Victor in NodeUA - JavaScript and Node.js in Ukraine
Переслано от Victor
уберутся подписки на вообще все ивэнты?
источник

N

Nick in NodeUA - JavaScript and Node.js in Ukraine
Victor
Переслано от Victor
https://nodejs.org/api/events.html#events_emitter_removealllisteners_eventname что произойдет если вызвать это без параметров? в доке не сказано
параметры не опциональные, поэтому так нельзя вызывать
источник

V

Victor in NodeUA - JavaScript and Node.js in Ukraine
с таких скобках же []
источник

V

Victor in NodeUA - JavaScript and Node.js in Ukraine
хотя я кажется уже понял, невнимательно читаю доку
источник

V

Victor in NodeUA - JavaScript and Node.js in Ukraine
Removes all listeners, or those of the specified eventName.
источник

V

Victor in NodeUA - JavaScript and Node.js in Ukraine
видимо таки все уберутся
источник

N

Nick in NodeUA - JavaScript and Node.js in Ukraine
Victor
с таких скобках же []
браузер почему-то мне показал removeListener, а не removeAllListeners, для него да, там указано поведение
источник

V

Victor in NodeUA - JavaScript and Node.js in Ukraine
спс
источник

А

Андрей in NodeUA - JavaScript and Node.js in Ukraine
Всем привет! Столкнулся с проблемой во время создания социальной сети. Уменя есть таблица Постов, Картинок для постов, Комментариев, Лайков и Пользавателей. У таблицы Постов есть поле repostedTo для связи один ко многим на саму себя. Нужно получить ленту, что приводит к вот такому SQL запросу:

SELECT posts.*,
 u."nickName",
 u."firstName",
 u."lastName",
 u.photo,
 pI.image AS image,
 pI."isMain" AS "isMain",
 "repostedPost".id AS "rpId",
 "repostedPost"."userId" AS "rpUserId",
 "repostedPost"."createdAt" AS "rpCreatedAt",
 "repostedPost".type AS "rpType",
 "repostedPost".text AS "rpText",
 rpI.image AS "rpImage",
 rpI."isMain" AS "rpIsMainImage",
 ur."firstName" AS "urFirstName",
 ur."lastName" AS "urLastName",
 ur."nickName" AS "urNickName",
 ur."photo" AS "urPhoto",
 COUNT(DISTINCT rp.id) AS "repostsCount",
 COUNT(DISTINCT likes."userId") AS "likesCount",
 COUNT(DISTINCT comments.id) AS "commentsCount"
FROM (SELECT id, "userId", "createdAt", "repostTo", type, text
FROM posts
WHERE ${condition}
ORDER BY "createdAt" ASC
LIMIT ? OFFSET ?) AS posts
 LEFT JOIN users AS u on u.id = posts."userId"
 LEFT JOIN likes AS "likes" on posts.id = likes."postId"
 LEFT JOIN comments AS "comments" on posts.id = comments."postId"
 LEFT JOIN posts AS rp on posts.id = rp."repostTo"
 LEFT JOIN "postImages" pI on posts.id = pI."postId"
 LEFT JOIN posts "repostedPost" on "repostedPost".id = posts."repostTo"
 LEFT JOIN "postImages" rpI on "repostedPost".id = rpI."postId"
 LEFT JOIN users ur on "repostedPost"."userId" = ur.id
GROUP BY pI.image, pI."isMain", posts."repostTo", posts.id, posts."userId", posts."createdAt", posts.type, posts.text,
u."nickName",
u."firstName",
u."lastName",
u.photo, "repostedPost".id,
"repostedPost"."userId",
"repostedPost"."createdAt",
"repostedPost"."repostTo",
"repostedPost".type,
"repostedPost".text, ur."firstName",
ur."lastName",
ur."nickName",
ur."photo", rpI.image,
rpI."isMain";

Нужен совет, как можно это сделать лучше?
источник

NK

Nikita Kutselay in NodeUA - JavaScript and Node.js in Ukraine
Если субд postgres, то добавь перед запросом EXPLAIN ANALYZE, вместо результата запроса база вернёт план его выполнения, посмотри самые тяжёлые места выполнения, их и нужно оптимизировать, про EXPLAIN ANALYZE можно в доке postgresa почитать
источник

А

Андрей in NodeUA - JavaScript and Node.js in Ukraine
Nikita Kutselay
Если субд postgres, то добавь перед запросом EXPLAIN ANALYZE, вместо результата запроса база вернёт план его выполнения, посмотри самые тяжёлые места выполнения, их и нужно оптимизировать, про EXPLAIN ANALYZE можно в доке postgresa почитать
Спасибо. Не слышал об этом раньше
источник

NK

Nikita Kutselay in NodeUA - JavaScript and Node.js in Ukraine
Ну базовые рекомендации это: добавить индексы на внешние ключи, которые используются в joinax, и вынести три операции count(distinct) в отдельное апи. count(distinct) на больших объемах данных очень тяжёлая операция
источник

А

Андрей in NodeUA - JavaScript and Node.js in Ukraine
Nikita Kutselay
Ну базовые рекомендации это: добавить индексы на внешние ключи, которые используются в joinax, и вынести три операции count(distinct) в отдельное апи. count(distinct) на больших объемах данных очень тяжёлая операция
Лучше будет сделать один роут для подсщёта сразу всех каунтов или лучше для лайков, репостов и коментов сделать отдельные эндпоинты?
источник

NK

Nikita Kutselay in NodeUA - JavaScript and Node.js in Ukraine
Андрей
Лучше будет сделать один роут для подсщёта сразу всех каунтов или лучше для лайков, репостов и коментов сделать отдельные эндпоинты?
Хотя можно и так сделать одним запросом:
WITH page_posts AS (
   SELECT *
   FROM posts
   WHERE ${condition}
   ORDER BY "createdAt" ASC
   LIMIT ?
   OFFSET ?
),
   page_posts_counters as (
   SELECT page_posts.id,
       COUNT(DISTINCT rp.id) AS "repostsCount",
       COUNT(DISTINCT likes."userId") AS "likesCount",
       COUNT(DISTINCT comments.id) AS "commentsCount"
   FROM page_posts
   LEFT JOIN likes AS "likes" on page_posts.id = likes."postId"
   LEFT JOIN comments AS "comments" on page_posts.id = comments."postId"
   LEFT JOIN posts AS rp on page_posts.id = rp."repostTo"
   GROUP BY page_posts.id
)

SELECT page_posts.*,
   page_posts_counters."repostsCount",
   page_posts_counters."likesCount",
   page_posts_counters."commentsCount",
   u."nickName",
   u."firstName",
   u."lastName",
   u.photo,
   pI.image AS image,
   pI."isMain" AS "isMain",
   "repostedPost".id AS "rpId",
   "repostedPost"."userId" AS "rpUserId",
   "repostedPost"."createdAt" AS "rpCreatedAt",
   "repostedPost".type AS "rpType",
   "repostedPost".text AS "rpText",
   rpI.image AS "rpImage",
   rpI."isMain" AS "rpIsMainImage",
   ur."firstName" AS "urFirstName",
   ur."lastName" AS "urLastName",
   ur."nickName" AS "urNickName",
   ur."photo" AS "urPhoto"
FROM page_posts
 LEFT JOIN users AS u on u.id = page_posts."userId"
 LEFT JOIN "postImages" pI on page_posts.id = pI."postId"
 LEFT JOIN posts "repostedPost" on "repostedPost".id = page_posts."repostTo"
 LEFT JOIN "postImages" rpI on "repostedPost".id = rpI."postId"
 LEFT JOIN users ur on "repostedPost"."userId" = ur.id

Вообще для ленты пагинация через limit/offset не самаяудобная, почитай про cursor pagination, во-первых она будет правильнее отображать посты, во-вторых в будущем когда данных в базе будет много она будет производительнее.
источник

А

Андрей in NodeUA - JavaScript and Node.js in Ukraine
Nikita Kutselay
Хотя можно и так сделать одним запросом:
WITH page_posts AS (
   SELECT *
   FROM posts
   WHERE ${condition}
   ORDER BY "createdAt" ASC
   LIMIT ?
   OFFSET ?
),
   page_posts_counters as (
   SELECT page_posts.id,
       COUNT(DISTINCT rp.id) AS "repostsCount",
       COUNT(DISTINCT likes."userId") AS "likesCount",
       COUNT(DISTINCT comments.id) AS "commentsCount"
   FROM page_posts
   LEFT JOIN likes AS "likes" on page_posts.id = likes."postId"
   LEFT JOIN comments AS "comments" on page_posts.id = comments."postId"
   LEFT JOIN posts AS rp on page_posts.id = rp."repostTo"
   GROUP BY page_posts.id
)

SELECT page_posts.*,
   page_posts_counters."repostsCount",
   page_posts_counters."likesCount",
   page_posts_counters."commentsCount",
   u."nickName",
   u."firstName",
   u."lastName",
   u.photo,
   pI.image AS image,
   pI."isMain" AS "isMain",
   "repostedPost".id AS "rpId",
   "repostedPost"."userId" AS "rpUserId",
   "repostedPost"."createdAt" AS "rpCreatedAt",
   "repostedPost".type AS "rpType",
   "repostedPost".text AS "rpText",
   rpI.image AS "rpImage",
   rpI."isMain" AS "rpIsMainImage",
   ur."firstName" AS "urFirstName",
   ur."lastName" AS "urLastName",
   ur."nickName" AS "urNickName",
   ur."photo" AS "urPhoto"
FROM page_posts
 LEFT JOIN users AS u on u.id = page_posts."userId"
 LEFT JOIN "postImages" pI on page_posts.id = pI."postId"
 LEFT JOIN posts "repostedPost" on "repostedPost".id = page_posts."repostTo"
 LEFT JOIN "postImages" rpI on "repostedPost".id = rpI."postId"
 LEFT JOIN users ur on "repostedPost"."userId" = ur.id

Вообще для ленты пагинация через limit/offset не самаяудобная, почитай про cursor pagination, во-первых она будет правильнее отображать посты, во-вторых в будущем когда данных в базе будет много она будет производительнее.
Большое спасибо!)
источник

ES

Elena Sharovar in NodeUA - JavaScript and Node.js in Ukraine
Андрей
Всем привет! Столкнулся с проблемой во время создания социальной сети. Уменя есть таблица Постов, Картинок для постов, Комментариев, Лайков и Пользавателей. У таблицы Постов есть поле repostedTo для связи один ко многим на саму себя. Нужно получить ленту, что приводит к вот такому SQL запросу:

SELECT posts.*,
 u."nickName",
 u."firstName",
 u."lastName",
 u.photo,
 pI.image AS image,
 pI."isMain" AS "isMain",
 "repostedPost".id AS "rpId",
 "repostedPost"."userId" AS "rpUserId",
 "repostedPost"."createdAt" AS "rpCreatedAt",
 "repostedPost".type AS "rpType",
 "repostedPost".text AS "rpText",
 rpI.image AS "rpImage",
 rpI."isMain" AS "rpIsMainImage",
 ur."firstName" AS "urFirstName",
 ur."lastName" AS "urLastName",
 ur."nickName" AS "urNickName",
 ur."photo" AS "urPhoto",
 COUNT(DISTINCT rp.id) AS "repostsCount",
 COUNT(DISTINCT likes."userId") AS "likesCount",
 COUNT(DISTINCT comments.id) AS "commentsCount"
FROM (SELECT id, "userId", "createdAt", "repostTo", type, text
FROM posts
WHERE ${condition}
ORDER BY "createdAt" ASC
LIMIT ? OFFSET ?) AS posts
 LEFT JOIN users AS u on u.id = posts."userId"
 LEFT JOIN likes AS "likes" on posts.id = likes."postId"
 LEFT JOIN comments AS "comments" on posts.id = comments."postId"
 LEFT JOIN posts AS rp on posts.id = rp."repostTo"
 LEFT JOIN "postImages" pI on posts.id = pI."postId"
 LEFT JOIN posts "repostedPost" on "repostedPost".id = posts."repostTo"
 LEFT JOIN "postImages" rpI on "repostedPost".id = rpI."postId"
 LEFT JOIN users ur on "repostedPost"."userId" = ur.id
GROUP BY pI.image, pI."isMain", posts."repostTo", posts.id, posts."userId", posts."createdAt", posts.type, posts.text,
u."nickName",
u."firstName",
u."lastName",
u.photo, "repostedPost".id,
"repostedPost"."userId",
"repostedPost"."createdAt",
"repostedPost"."repostTo",
"repostedPost".type,
"repostedPost".text, ur."firstName",
ur."lastName",
ur."nickName",
ur."photo", rpI.image,
rpI."isMain";

Нужен совет, как можно это сделать лучше?
В высоконагруженных проектах стараются делать запросы максимально простыми. Лучше сделать 2-4 запроса попроще и смержить данные в памяти, чем городить кучу джойнов. Потому что простые запросы "оптимизируются" на уровне базы данных и база данных быстрее отдает ответ.
источник