@nodejs_ru

Страница 963 из 2748
Yaroslav
07.07.2017
06:53:55
Zaur
07.07.2017
06:54:29
Yaroslav
07.07.2017
06:54:50
2147483647 !== 0x80000000
я понимаю, я привел пример, что если брать не лимиты, то все ок (отнял 1)

2147483648 == 0x80000000

Google
Zaur
07.07.2017
06:55:12
я понимаю, я привел пример, что если брать не лимиты, то все ок (отнял 1)
так это и ежу понятно, вопрос в том почему после 32 бит получаются отрицательные числа

Дмитрий
07.07.2017
06:55:31
Лол

Zaur
07.07.2017
06:55:38
2147483648 == 0x80000000
> 2147483648 === 0x80000000 true

Дмитрий
07.07.2017
06:56:10
Потому что вечно паришься из-за такой вот фигни и округления

Zaur
07.07.2017
06:56:12
Вот, собственно, поэтому
т.е. number сводится к int32 ?

Dika
07.07.2017
06:56:28
да

Дмитрий
07.07.2017
06:56:48
Вместо того, чтобы взять любую либу для big int (или не выёживаться и писать в нормальные адекватные boolean)

? гриб
07.07.2017
06:56:50
Dika
07.07.2017
06:56:59
"Побитовые операторы в JavaScript работают с 32-битными целыми числами в их двоичном представлении." https://learn.javascript.ru/bitwise-operators

Zaur
07.07.2017
06:57:07
??
это был ответ на вопрос, хз зачем он ему нужен был)

Yaroslav
07.07.2017
06:57:28
да, переполнение)

Google
Yaroslav
07.07.2017
06:57:32
да
спасибо)

Zaur
07.07.2017
06:59:42
все понятно, всем спасибо. Другой вопрос, как лучше организовать хранение кучи настроек которе могут иметь только true/false? У меня сейчас 31 настроек хранятся в одном поле flags:int, я вижу решение только создать второе поле в базе mysql flags2 и там продолжить.

Vsevolod
07.07.2017
07:02:15
в жсоне храни

мускуль же вроде его поддерживает?

Сергей
07.07.2017
07:03:05
Жсонб в постгрес хорошее дело

Enjoy the
07.07.2017
07:03:49
>реляционные бд

Zaur
07.07.2017
07:04:16
Мускуль не нужен
а когда мускуль уже осел прочно в проекте, и надо > 31 настроек хранить? ))

Сергей
07.07.2017
07:07:50
Чаще всего мускуль никогда не имеет преимуществ перед постгресом

Zaur
07.07.2017
07:08:46
а какие у него есть плюсы? почему я должен захотеть мигрировать? все таки это время :( которого нет

Denis
07.07.2017
07:09:15
Zaur
07.07.2017
07:09:35
Может просто разбить на две колонки по int32
ну вот я вышел так и написал, вопрос был есть ли способ лучше

а то чувак с длинным ником говорит что это плохо :)

Дмитрий
07.07.2017
07:15:00
32 поля — это не то количество при котором нужно начинать экономить на спичках, имхо

Храни в bool по нормальному и всё)

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

Zaur
07.07.2017
07:21:42
32 поля — это не то количество при котором нужно начинать экономить на спичках, имхо
Вот ты сейчас просто уничтожил все мое представление о бд. Я тут вообще дунуть лишний раз боюсь... это мой первый бэк проект. Кто нибудь готов еще подтвердить слова что ➕➖32 поля - это фигня в mysql для телеграм бота, в котором в день ~50 000 кликов.

Дмитрий
07.07.2017
07:22:23
У тебя на каждый клик записываются отдельные 32 поля?) Тогда другой вопрос

Zaur
07.07.2017
07:22:55
нет, каждый клик - это чтение записи, где 32 поля.

Google
Zaur
07.07.2017
07:23:07
записей в день ~500

Сергей
07.07.2017
07:33:04
Ты бы ещё в монге хранил

Zaur
07.07.2017
07:34:21
Ты бы ещё в монге хранил
это стеб или совет? :) я честно не знаю что лучше

Alexander
07.07.2017
07:35:42
Народ, как вы прикручиваете bcrypt к коду с async/await ?

Сергей
07.07.2017
07:37:17
Konstantin
07.07.2017
07:37:59
Народ, как вы прикручиваете bcrypt к коду с async/await ?
Этот пакет? — https://www.npmjs.com/package/bcrypt

Alexander
07.07.2017
07:40:18
Этот-этот

UserSchema.methods.comparePasswords = function comparePasswords(password) { return bcrypt.compare(password, this.password); }; всегда возвращает undefined

что делает невозможным использование try/catch

Сергей
07.07.2017
07:43:02
Этот-этот
В чем сложность

Alexander
07.07.2017
07:43:18
выше написал

Сергей
07.07.2017
07:43:33
что делает невозможным использование try/catch
Обёртку написать в чем проблема

Alexander
07.07.2017
07:43:55
например?

я в контроллере переписал вот так: (без try/catch) const matches = await user.comparePasswords(password); if (matches) { ctx.body = user; } else { ctx.throw(400, 'Bad credentials') }

Обёртку написать в чем проблема
возможно не хватает опыта)

и должна ли вообще в теории вот эта запись возвращать undefined: return bcrypt.compare(password, this.password);

Vsevolod
07.07.2017
07:49:13
ты неправильно используешь метод

скорее всего

Google
Vsevolod
07.07.2017
07:49:22
там промис?

или что он возвращает

Сергей
07.07.2017
07:50:59
Мб на колбэках

Бля

Так там колбэки

Alexander
07.07.2017
07:51:37
или что он возвращает
буквально, console.log(bcrypt.compare(password, this.password)); в консоли возвращает Promise { <pending> }

Сергей
07.07.2017
07:52:01
Так промис

Konstantin
07.07.2017
07:52:25
Там промис, но он не throw-ится при несопадении, а резовлится в false

Admin
ERROR: S client not available

Konstantin
07.07.2017
07:53:15
https://github.com/kelektiv/node.bcrypt.js#with-promises

Alexander
07.07.2017
07:54:08
у меня ещё подключен bluebird : mongoose.Promise = bluebird;

короче, каюсь, но мне бы более простым языком )

а то "так там колбэк", "так там промис"

? гриб
07.07.2017
07:56:50
?

"110010"

Konstantin
07.07.2017
08:00:02
const bcrypt = require('bcrypt'); class UserSchema { constructor(hash) { this.hash = hash; } comparePasswords(password) { return bcrypt.compare(password, this.hash); } } async function start() { const hash = await bcrypt.hash('secret', 10); const user = new UserSchema(hash); const passwordsMatch = await user.comparePasswords('secret'); if (passwordsMatch) { console.log('passwords match'); } else { console.warn('passwords do not match'); } } start();

Alexander
07.07.2017
08:02:11
благодарю. к такому решению и я пришёл

Алексей
07.07.2017
08:17:32
что-то не догоняю callback function findIssue (issueKey) { jira.issue.getIssue({ issueKey: issueKey }, function (error, issue) { if (error) { return 0; } return 1; } ) } console.log(findIssue (issueKey)) // undefined Читаю и начитаться не могу, в общем помогите вернуть 0 || 1 Извиняюсь за нубский вопрос...

Google
Bohdan
07.07.2017
08:23:46
Ты возвращаешь результат в функцию, которая вызывает коллбэк

Нужно в функцию findIssue передать функцию коллбэк, и в коллбэке к методу jira.issue.getIssue вызывать этот коллбэк

Konstantin
07.07.2017
08:25:11
function findIssue(issueKey) { return new Promise((resolve, reject) => { jira.issue.getIssue({ issueKey }, (error, issue) => error ? reject(error) : resolve(issue)); }); } и вызов где-нибудь внутри async-функции: const result = await findIssue(...); console.log(result); // 0 или 1

Bohdan
07.07.2017
08:26:28
function findIssue (issueKey, callback) { jira.issue.getIssue({issueKey: issueKey}, function (error, issue) { if (error) { return callback(0); } callback(1); } ) } findIssue (issueKey, function(result) { console.log(result) })

та куда же ему промисы, если он с коллбэками не разобрался)

Дмитрий
07.07.2017
08:27:55
callback -> promise -> async/await -> stream -> future -> callback

Сергей
07.07.2017
08:28:38
Bohdan
07.07.2017
08:28:40
что за деградация к коллбэкам)))

Вишневый чай
07.07.2017
08:29:25
что за деградация к коллбэкам)))
тут не деградация и круговорт какой-то

Таймураз
07.07.2017
08:29:36
-> haskell -> death |
Тогда уж -> delphi -> death by accident

Сергей
07.07.2017
08:30:58
Not accidental death by a delphi

Alexander
07.07.2017
08:35:29
ну как.. если вот это можно считать решением, а не костылём.. то решил: const matches = await user.comparePasswords(password); if (matches) { ctx.body = user; } else { ctx.throw(400, 'Bad credentials') }

Таймураз
07.07.2017
08:35:40
И почему вы не используете встроенные методы ноды?

Alexander
07.07.2017
08:36:05
я больше фронт, вот только-только чота начинаю писать на ноде, поэтому многого не знаю

Таймураз
07.07.2017
08:36:13
import { createHmac, randomBytes } from 'crypto'; function encryptPassword(password, salt) { if (!password) return false; return createHmac('sha256', salt).update(password).digest('hex'); } function setPassword(password) { const generatedSalt = randomBytes(128).toString('hex'); this.salt = generatedSalt; this.hashedPassword = encryptPassword(password, generatedSalt); }

UserSchema.methods = { checkPassword(password) { const { salt, hashedPassword } = this; return encryptPassword(password, salt) === hashedPassword; } };

Страница 963 из 2748