Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (3)

Наибольший вклад в теги

Все теги (55)

Лучшие ответы пользователя

Все ответы (108)
  • Можно ли скачать видео с помощью nodejs?

    @Abcdefgk
    var fs = require('fs')
    	, request = require('request');
    
    request.get('http://fs.moviestape.net/video/1c4ed0ac8b7d5b4de6c5d58e2ea31a63/serials/Narcos/s01/Narcos.S01E01.mp4')
    			.on('error', function(err) {
    				console.error(err);
    			})
    			.on('response', function(res) {
    				console.log(res.statusCode);
    				console.log(res.headers['content-type']);
    			})
    			.pipe(fs.createWriteStream('Narcos.S01E01.mp4'))
    			.on('finish', function() {
    				console.log('OK');	
    			});
    Ответ написан
  • Как разобраться с авторизацией в Node.js?

    @Abcdefgk
    Ну, запугали человека - криптография-шриптография.
    Модуль passport - для того и готовый модуль, что он сам всю эту криптографию-шмиптографию сделает. Просто нужно освоить несколько пунктов.
    1. Установить в проект и настроить модули express-session и coockie-parser
    Без них passport не будет работать - а в чём же будет тогда смысл его работы, если он в сессию и записывает юзера после регистрации.авторизации? ("сессия" - это специальный подобъект в объекте request - req.session - куда passport сам вписывает под-объект user после авторизации)
    2. Разобраться, что passport - это общий модуль, который обеспечивает работу дополнительных модулей, в которых содержатся, как раз, всякие разные стратегии авторизации - локальная стратегия, через Фейсбук (passport-facebook), через Гугол (passport-google-oauth) и т.д.
    3. Для авторизаций через соцсети нужно в каждом случае поразбираться, как в них создавать "приложения" - оттуда для стратегий нужно будет брать ID юзера и Key, которые эти доп-модули будут запрашивать.
    4. Создаётся один большой файл-модуль для авторизации - типа auth.js - куда реквайрится сам passport плюс реквайрятся нужные (по желанию) стратегии. Типа вот так выглядит верхушка файла:
    var passport = require('passport')
    , FacebookStrategy = require('passport-facebook').Strategy
    , GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
    и для каждой из стратегий пишется код, который уже весь есть в документации модуля passport - его нужно оттуда взять и в нём, конечно, поразбираться. Не в криптографии-шриптогравии, а в этом конкретном коде.
    (Ну, и книжку внимательно изучить - я говорил в другом месте, какую)
    Ответ написан
  • Как из одной схемы сослаться на вторую?

    @Abcdefgk
    const Schema = mongoose.Schema; //так просто удобнее
    
    const brandSchema = new Schema ({
      name: String,
      image: String
    });
    
    const productSchema = new Schema ({
      name: String,
      image: String,
      brand: { type: Schema.Types.ObjectId, ref: 'Brand' } // этот ref ссылается на имя модели, которое будет ниже
    });


    var Brand = mongoose.model('Brand', brandSchema); // вот оно, это имя в казычках
    var Product = mongoose.model('Product', productSchema);

    Теперь во время сохранения документа с продуктом ему в поле brand надо передавать id брэнда, к которому он относиться.

    var briony = new Brand({
      name: "Briony",
      image: ".../briony.jpg"
    });
    var shapka = new Product({
      name: "Shapka",
      image: "...../shapka.jpg",
      brand: briony // тут id брэнда этой шапки (как показал чувак в том ответе - и я проверял - mongoose сам сообразит именно id брэнда вписать по переменной briony, но можно и явно - briony._id)
    });
    briony.save();
    shapka.save();

    Только это бессмысленное использование populate. Его смысл заключается в том, чтобы не передавать в документ много информации о соотносимом с ним документом - когда этой информации там действительно много. А тут только две строчки: имя и ссылка на логотип.
    Смысл могло бы иметь обратное действие. Добавляем в схему брэндов поле:
    const brandSchema = new Schema ({
      name: String,
      image: String,
      products: [{ type: Schema.Types.ObjectId, ref: 'Product' }]
    });

    И сохранив в базу документ shapka, здесь же делаем push её айдишника в массив продуктов от Briony:
    var briony = new Brand({
      name: "Briony",
      image: ".../briony.jpg"
    });
    briony.products.push(shapka._id);

    Вот теперь в поле products документ с именем Briony будет иметь не массив больших объектов с названиями продуктов, их описанием, ценой и т.д., а массив только айдишников продуктов, к этому брэнду относящихся.
    И наоборот. Если схема брэнда предполагает не только его имя и картинку, а и ещё какое-то описание, длинную историю и т.д., то это всё не надо вписывать в документ продукта, а вписать только id бренда, а всю эту подробную муть запрашивать во время запроса документа shapka с помощью как раз populate:
    Product
      .findOne({ name: 'Shapka' })
      .populate('brand') // это означает "заселить", т.е. по айдишнику, вписанному в поле brand продукта, найти в коллекции брендов - нужный брэнд и вывалить сюда всю о нём информацию
      .exec ... // и т.д.

    Или
    Product
      .findOne({ name: 'Shapka' })
      .populate('brand', 'image')
      .exec ... // и т.д.

    если от бренда нужна только его картинка нопремер.
    (или только его имя - .populate('brand', 'name')

    Как-то так.
    Ответ написан

Лучшие вопросы пользователя

Все вопросы (5)