Anonymous
dns или рандомный сервер?
Vladis🩸Love ️
ладно, спасибо. попробую сам разобраться
Michael
А есть возможность еспресс роут не светить наружу. А использовать только внутри аппликейшена ?
Eldar
А зачем тебе такой роут? oO
Eldar
Именно как роут а не функция
Michael
я могу ему кормить мидлвари
Michael
В таком виде как мне нужно
Eldar
Но технически есть, но тебе тогда нужно отдельного слушателя (сервер) делать который будет принимать запросы только 127.0.0.1 и навешивать роут ему, а не общему app
Michael
Такое не очень подходит(
Michael
я уже думал над этим
Eldar
Тогда сделай паблик роут, но с мидлварой которая будет проверять что запрос на самом деле локальный
Eldar
Снаружи его все равно хер кто подберет по пути /myawesomeinsideroute, а если и подберет, то мидлвара зарежет
Nikita
Там в тот эпический PR в спеку прибежал автор Bower-а и сказал, что он вообще хочет чтобы в жс новая строка всегда означала точку с запятой и предложил всё сломать и сделать так.
Nikita
Nikita
Выбирай максимальную возможную, в твоём случае это 7.
Nikita
спасибо
Nikita
Nikita
не надо 7 выбирать
Nikita
7 не поддерживается больше.
Nikita
https://raw.githubusercontent.com/nodejs/Release/master/schedule.png
Nikita
Anton
Задача написать бота, есть 3 шага:
1. ЗАпрашиваем данные с внешенго апи
2. Отправляем если нужно уточняющий вопрос юзера, обобатываем ответ. Вопросов может быть несколько.
3. Отправляем юзеру результат.
Т.е. задача сохранять контекст, чтобы понимать как обрабатывать вхоящие от юзера сообщения.
Также нужно, чтобы при перезапуске сервера работа не терялась. Т.е. если бот ждет ответа от юзера, то ждал бы его и дальше после перезапуска.
Я накидал алгоритм со стейт машиной и сохранением в бд текущего контекста юзера, но задумался а не велосипед ли я горожу. Есть может какие либы, бест практисы по этому делу?
Vitaliy
мне нужен принцип dns
Именно через dns это как раз просто сделать — несколько алиасов с одинаковым весом
Vitaliy
Anton
Vitaliy
Тогда все правильно сделал :)
Sunlive
Привет. Подскажите пожалуйста, начал сегодня учить коа, пишу рест апи, но мне почему то приходит 204 пустой респонс. Где я накосячил? в упор не вижу уже
export const createUser = async ctx => {
ctx.body = await bcrypt.hash(ctx.request.body.password, 10, (err, hash) =>
User.find({ email: ctx.request.body.email })
.exec()
.then(user => {
if (user.length >= 1) {
ctx.throw(409, 'Mail already used');
}
if (err) {
ctx.throw(500, err);
}
const USER = new User({
_id: new mongoose.Types.ObjectId(),
email: ctx.request.body.email,
password: hash,
});
USER.save().then(result => ({ message: 'User created!', user: result }));
})
.catch(er => ({
message: 'hello world',
err: er,
})),
);
};
✙ galactico ✙
гайз, а промисы сразу начинают выполняться, как только мы его создали, или только когда then прицепили ?
сomorsiс
bcrypt.hash не возвращает промис
Nurik
Привет. Подскажите пожалуйста, начал сегодня учить коа, пишу рест апи, но мне почему то приходит 204 пустой респонс. Где я накосячил? в упор не вижу уже
export const createUser = async ctx => {
ctx.body = await bcrypt.hash(ctx.request.body.password, 10, (err, hash) =>
User.find({ email: ctx.request.body.email })
.exec()
.then(user => {
if (user.length >= 1) {
ctx.throw(409, 'Mail already used');
}
if (err) {
ctx.throw(500, err);
}
const USER = new User({
_id: new mongoose.Types.ObjectId(),
email: ctx.request.body.email,
password: hash,
});
USER.save().then(result => ({ message: 'User created!', user: result }));
})
.catch(er => ({
message: 'hello world',
err: er,
})),
);
};
Проверяй мидлварь, если есть.
Anonymous
Привет. Подскажите пожалуйста, начал сегодня учить коа, пишу рест апи, но мне почему то приходит 204 пустой респонс. Где я накосячил? в упор не вижу уже
export const createUser = async ctx => {
ctx.body = await bcrypt.hash(ctx.request.body.password, 10, (err, hash) =>
User.find({ email: ctx.request.body.email })
.exec()
.then(user => {
if (user.length >= 1) {
ctx.throw(409, 'Mail already used');
}
if (err) {
ctx.throw(500, err);
}
const USER = new User({
_id: new mongoose.Types.ObjectId(),
email: ctx.request.body.email,
password: hash,
});
USER.save().then(result => ({ message: 'User created!', user: result }));
})
.catch(er => ({
message: 'hello world',
err: er,
})),
);
};
+
Nurik
Sunlive
я при этом, специально пытаюсь создать юзера с уже использованным мылом, все равно пусто о_О
сomorsiс
убери колбек и заюзай промисы как в доках
Sunlive
вот тоже самое на экспрессе
router.post('/signup', (req, res) => {
bcrypt.hash(req.body.password, 10, (err, hash) => {
User.find({ email: req.body.email })
.exec()
.then(user => {
if (user.length >= 1) {
return res.status(409).json({
message: 'Mail already used',
});
}
if (err) {
return res.status(500).json({
error: err,
});
}
const USER = new User({
_id: new mongoose.Types.ObjectId(),
email: req.body.email,
password: hash,
});
USER.save()
.then(result => {
res.status(201).json({
message: 'User Created!',
user: result,
});
})
.catch(error =>
res.status(500).json({
error,
}),
);
});
});
});
и оно работает
сomorsiс
а еще return перед USER.save
Sunlive
да ставил
Sunlive
но все равно не але
сomorsiс
сomorsiс
(ты просто пытался await на штуку которая по факту ничего не возвращает навесить)
Nurik
Привет. Подскажите пожалуйста, начал сегодня учить коа, пишу рест апи, но мне почему то приходит 204 пустой респонс. Где я накосячил? в упор не вижу уже
export const createUser = async ctx => {
ctx.body = await bcrypt.hash(ctx.request.body.password, 10, (err, hash) =>
User.find({ email: ctx.request.body.email })
.exec()
.then(user => {
if (user.length >= 1) {
ctx.throw(409, 'Mail already used');
}
if (err) {
ctx.throw(500, err);
}
const USER = new User({
_id: new mongoose.Types.ObjectId(),
email: ctx.request.body.email,
password: hash,
});
USER.save().then(result => ({ message: 'User created!', user: result }));
})
.catch(er => ({
message: 'hello world',
err: er,
})),
);
};
Я вот не понимаю почему ты не юзаешь async/await если у тебя функция объявлена асинхронной ?
Nurik
Перепиши в синхронном стиле, может, найдешь причину.
Sunlive
Nurik
В любом случае, дебаг тебе в руки.
Sunlive
единственное скажите, ctx.throw() норм юзать?
Nurik
Nurik
throw new Error
Sunlive
а ок, оно и так внутри трайкетча
Sunlive
ща
Sunlive
try {
ctx.body = await bcrypt
.hash(ctx.request.body.password, 10)
.then(hash => {
const USER = new User({
_id: new mongoose.Types.ObjectId(),
email: ctx.request.body.email,
password: hash,
});
return USER.save();
})
.then(result => ({ message: 'User created!', user: result }))
.catch(err => {
ctx.throw(500, err)
});
} catch (error) {
ctx.body = error;
}
сomorsiс
не смешивай так промисы и await
Sunlive
да я ща перепишу еще разок
Sunlive
на эвэйты уже
Sunlive
так, версия 3
Sunlive
try {
const hash = await bcrypt.hash(ctx.request.body.password, 10);
const USER = new User({
_id: new mongoose.Types.ObjectId(),
email: ctx.request.body.email,
password: hash,
});
const result = await USER.save();
ctx.body = {
message: 'User Created!',
user: result,
};
} catch (error) {
ctx.body = error;
}
Sunlive
работает вроде))
Sunlive
всем спасибо, парни
A
Всем привет, такой вопрос, Content-type вообще можно как-то кастомно уставноить допустим только на application/json?
А то у меня получается такой прикол после пост запроса, что request content type application/json, а response text/html из-за чего у меня Failed to lookup view "error" in views directory "/src/views"(типо он пытается срендерить какую-то страницу и не может ее найти)
Nurik
try {
const hash = await bcrypt.hash(ctx.request.body.password, 10);
const USER = new User({
_id: new mongoose.Types.ObjectId(),
email: ctx.request.body.email,
password: hash,
});
const result = await USER.save();
ctx.body = {
message: 'User Created!',
user: result,
};
} catch (error) {
ctx.body = error;
}
Вот тебе с сипользованием async/await. Начинай сразу с ним, не тяни.
function hash(pass,length){
return new Promise((resolve, reject) => {
bcrypt.hash(pass, length,(err, hash) => {
if(err){return reject(err);}
resolve(hash);
});
});
}
export const createUser = async (ctx,next) => {
try{
let hashedPassword = await hash(ctx.request.body.password,10);
let user = await User.find({ email: ctx.request.body.email });
if (user.length >= 1) {
return ctx.throw(409, 'Mail already used');
}
const USER = new User({
_id: new mongoose.Types.ObjectId(),
email: ctx.request.body.email,
password: hash,
});
let savedUser = await USER.save();
ctx.body = { message: 'User created!', user: savedUser };
} catch(err){
throw err;
}
};
Eugeny
всем привет, после установки модулей mongodb и mongoose, условно говоря, создал юзера, засейвил его, в консольке вижу, что он создался, все ок. Такой вопрос, где эти данные хранятся?В какой дирректории?
сomorsiс
Вот тебе с сипользованием async/await. Начинай сразу с ним, не тяни.
function hash(pass,length){
return new Promise((resolve, reject) => {
bcrypt.hash(pass, length,(err, hash) => {
if(err){return reject(err);}
resolve(hash);
});
});
}
export const createUser = async (ctx,next) => {
try{
let hashedPassword = await hash(ctx.request.body.password,10);
let user = await User.find({ email: ctx.request.body.email });
if (user.length >= 1) {
return ctx.throw(409, 'Mail already used');
}
const USER = new User({
_id: new mongoose.Types.ObjectId(),
email: ctx.request.body.email,
password: hash,
});
let savedUser = await USER.save();
ctx.body = { message: 'User created!', user: savedUser };
} catch(err){
throw err;
}
};
bcrypt имеет промисное апи
сomorsiс
ок
Sunlive
Вот тебе с сипользованием async/await. Начинай сразу с ним, не тяни.
function hash(pass,length){
return new Promise((resolve, reject) => {
bcrypt.hash(pass, length,(err, hash) => {
if(err){return reject(err);}
resolve(hash);
});
});
}
export const createUser = async (ctx,next) => {
try{
let hashedPassword = await hash(ctx.request.body.password,10);
let user = await User.find({ email: ctx.request.body.email });
if (user.length >= 1) {
return ctx.throw(409, 'Mail already used');
}
const USER = new User({
_id: new mongoose.Types.ObjectId(),
email: ctx.request.body.email,
password: hash,
});
let savedUser = await USER.save();
ctx.body = { message: 'User created!', user: savedUser };
} catch(err){
throw err;
}
};
👍🏻 в итоге у нас очень похоже вышло, я выше кинул уже
сomorsiс
Sunlive
Nurik
Sunlive
просто выбрасывать?
сomorsiс
<logging error>
return ctx.throw(500)
сomorsiс
а
сomorsiс
лучше бросить, окей
Nurik
просто выбрасывать?
По хорошему, нужно создавать свои ошибки отнаслеодванные от Error. И уже их прокидывать, учитывая environment. С X-Request-Id чтобы легче было дебажить в дальнейшем.
Sunlive
Anonymous
Всем привет) МБ кто-то сталкивался, нужно определять девайс который стучится по api в таком виде, модель телефона/устройства, но плагина не нашел(
Или это делается на фронте и отправляется уже дальше
Cenator 🐈
Cenator 🐈
хотя хз причем он тут
Cenator 🐈
но устройство определить непросто
Evgeny