Willy
Sir, это же реклама ноды, да? =(
Камиль
ребят подскажите, мне нужно на сервак грузить картинку и нужно сделать проверку на то что это не исполняемый файл, а именно картинка
Камиль
как это провернуть
Den
Попробуй библиотекой по работе с картинками открыть этот файл
Камиль
типо имеджМаджика?
Den
В ноде с картинками не работал, но в ПХП есть функция, которой открываешь файл, а потом получаешь инфу о картинке, типа расширение, размер фото и т.д. В случае, когда грузишь не картинку, он кидает ошибку
Den
типо имеджМаджика?
Можно и им, он должен ругнуться, что файл не является картинкой
Камиль
еще вопрос в статьях на тему загрузки изображений с формы везде либа formidable
Den
Либо читать стандарты и самому писать функцию, которая будет читать заголовки файла и решать, картинка это или нет
Камиль
зачем ее юзают?
Den
Полагаю, что она удобна, когда надо получать тело типа multipart form data
Камиль
ну то есть без нее я тоже смогу спокойно получить файл
Камиль
еще вопрос, где можно посмотреть размер npm пакета
Den
Сможешь, если воспользуешься другой библиотекой. Сам nodejs не парсит запрос из браузера, это делают различные библиотеки. Для express это обычно body-parser
Камиль
спасибо
Камиль
почему то в статьях юзают и бодипарсер и формидабл
Камиль
нашел на стаке что бодипарсер обрабатывает только json
Дима
Ребят подскажите пж-та как можно улучшить связи в mongoose.
Дима
Есть маршрут для отрисовки 1 статьи + все ее комментарии
Дима
Вот так это выглядит в express router
Дима
// Get post by id router.get('/:postId', (req, res, next) => { mongoose.connect(url); var Post = mongoose.model("Post", postScheme); var id = req.params.postId; Post.findById(id, function(err, doc) { var Comment = mongoose.model("Comment", commentScheme); Comment.find({post_id: id}, function(err, coma) { mongoose.disconnect(); res.render('post/show', { title: doc.title, post: doc, comments: coma, }); }); }); });
Дима
Получается что я вызываю модель Comment внутри функции Post.find...
Дима
Может есть более элегантный способ, как можно отрисовать все комментарии к статье
Дима
В модели Comment в качестве внешнего ключа указан post_id с uuid найденого поста
Pavel
Так эти запросы можно паралельно делать
Pavel
Используйте промисы и будет красиво
Дима
Дима
И еще вопрос.
Дима
Вот я построил запрос с .then:
Дима
User.find({}).then( data => { res.render('user/index', {title: "Users", users: data}); });
Дима
Мне нужно вынести из функции, запрос на ренедр шаблона
Дима
Но из-за локального окружения функции доступ к данным нет
Дима
Хочется так
Дима
User.find({}).then( data => { // тут будет запись данных во внеш. переменную }); res.render('user/index', {title: "Users", users: data});
Vitaly
async/await
Alexey
User.find({}).then( data => { // тут будет запись данных во внеш. переменную }); res.render('user/index', {title: "Users", users: data});
Ловишь ошибку через catch, из catch совращаешь промис который резолвит пустой массив
Alexey
https://learn.javascript.ru/promise
Дима
router.get('/', function(req, res, next) { mongoose.connect(url); var User = mongoose.model("User", userScheme); var users = User.find({}) .then(data => data) .catch(err => err); res.render('user/index', {title: "Users", users: users}); });
Дима
На отсутствие переменной users, обработчик не ругается. Однако никаких данных нет
Vitaliy
они есть просто ты не ждеш пока их достанешь
Vitaliy
ти сразу отправляешь undefined у рендер
Vitaliy
или через await сделай
Камиль
ребят подскажите бодипарсер-экспреса не может файлы парсить же
Anatoliy
Vitaliy
файлы что сервер шлет?
Дима
рендер в then перенеси
надо наооборот, рендер должен быть вне промисов
Evgeny
надо наооборот, рендер должен быть вне промисов
ага, удачи тебе в этом начинании. Что по твоему возвращает async function(){} ?
Камиль
не если с фронта нужно отправлять файл на сервак
Камиль
нужно мультипарт форм дату использовать
Камиль
а бодипарсер не может в нее же
Evgeny
а бодипарсер не может в нее же
https://github.com/expressjs/body-parser у них предложены пакеты в документации
Vitaliy
есть multer
Камиль
https://github.com/expressjs/body-parser у них предложены пакеты в документации
спасибо, я как раз в сторону formidable смотрел
Дима
Есть какой-нибудь способ чтобы все таки пробросить данные на внешний уровень?
Evgeny
пока еще не знаю.
ну просто ты привел пример на промисах, я тебе предложил решение на промисах=)
Vitaliy
async/await
Дима
router.get('/', function(req, res, next) { mongoose.connect(url); var User = mongoose.model("User", userScheme); var users = User.find({}) .then(data => data) .catch(err => err); res.render('user/index', {title: "Users", users: users}); });
Дима
Мне надо чтобы переменная users отдавала данные из then
Vitaliy
ставишь await на Users.find; и все
Дима
и чтобы в шаблоне res.render уже поступали данные а не пустота как сейчас
Evgeny
ставишь await на Users.find; и все
await теперь можно использовать без async? О_о
Дима
ставишь await на Users.find; и все
ругается на синтаксическую ошибку. Да и я понимаю что так нелья
Vitaliy
обяз должнен быть await
Алексей
res.render выполняется не в then > перед User.fin... Вам нужно ознакомиться с промисами
Дима
что за ошибка?
router.get('/', function(req, res, next) { mongoose.connect(url); var User = mongoose.model("User", userScheme); var users = await User.find({}) .then(data => data) .catch(err => err); res.render('user/index', {title: "Users", users: users}); });
Дима
.then(data => await data) ^^^^^ SyntaxError: missing ) after argument list
Алексей
не так
Vitaliy
http://thecodebarbarian.com/using-async-await-with-mocha-express-and-mongoose
Алексей
router.get('/', async function(req, res, next) { ... try{ var users = await User.find({}) } catch{}