
Yaroslav
07.07.2017
06:53:55

Zaur
07.07.2017
06:54:29

Yaroslav
07.07.2017
06:54:50
2147483648 == 0x80000000

Google

Zaur
07.07.2017
06:55:12

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

Zaur
07.07.2017
06:55:38

Дмитрий
07.07.2017
06:55:45

Dika
07.07.2017
06:55:57

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

Zaur
07.07.2017
06:56:12

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
а то чувак с длинным ником говорит что это плохо :)

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

Zaur
07.07.2017
07:21:42

Дмитрий
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

Сергей
07.07.2017
07:34:29

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

Сергей
07.07.2017
07:37:17

Konstantin
07.07.2017
07:37:59

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

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"

Alexander
07.07.2017
07:57:37

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:19

Сергей
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

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

Таймураз
07.07.2017
08:34:13

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;
}
};