Создать пользователя с аватаром - PullRequest
0 голосов
/ 24 марта 2019

Я хочу добавить аватар в регистрацию пользователя, но не знаю как, пожалуйста, кто-нибудь может поделиться со мной полным примером (форма, JS front и JS backend). Я использую SailsJS 1.0 (стабильная версия) с VueJs. Заранее спасибо.

1 Ответ

2 голосов
/ 04 апреля 2019

Я понял это. Посмотрите эти уроки Platzi:

Вот что видео говорят вам сделать:

  1. npm i sails-hook-uploads.
  2. В api/controllers/entrance/signup.js

    1. Над inputs ключом добавить новый ключ / значение files: ['avatar'],
    2. В inputs добавить:

      avatar: {
          type: 'ref',
          required: true
      }
      
  3. В теле fn найдите var newUserRecord и выше этого добавления (даже если аватар не требуется, обязательно сделайте эту строку, в противном случае у вас будет «тайм-аут потока файлов без прерывания»:

    const avatarInfo = await sails.uploadOne (input.avatar);

  4. Затем в первом аргументе объект var newUserRecord = await User.create(_.extend({ добавить:

    avatarFd: avatarInfo.fd,
    avatarMime: avatarInfo.type
    
  5. В api/models/User.js добавьте эти атрибуты к вашей User модели:

    avatarFd: {
        type: 'string',
        required: false,
        description: 'will either have "text" or "avatarFd"'
    },
    
    avatarMime: {
        type: 'string',
        required: false,
        description: 'required if "avatarFd" provided'
    },  
    
  6. Затем создайте конечную точку загрузки, вот как будет выглядеть действие:

    const user = await User.findOne(id);
    
    this.res.type(paste.photoMime);
    
    const avatarStream = await sails.startDownload(paste.photoFd);
    
    return exits.success(avatarStream);
    
  7. Добавить к маршрутам маршрут для этой конечной точки аватара загрузки.

  8. Затем вы можете отобразить этот аватар, указав <img src=""> источник здесь на эту конечную точку загрузки.

------ ПРИЛОЖЕНИЕ -----

---- signup.js -----

module.exports = {


  friendlyName: 'Signup',


  description: 'Sign up for a new user account.',


  extendedDescription:
`This creates a new user record in the database, signs in the requesting user agent
by modifying its [session](https://sailsjs.com/documentation/concepts/sessions), and
(if emailing with Mailgun is enabled) sends an account verification email.

If a verification email is sent, the new user's account is put in an "unconfirmed" state
until they confirm they are using a legitimate email address (by clicking the link in
the account verification message.)`,


  files: ['avatar'],

  inputs: {

    emailAddress: {
      required: true,
      type: 'string',
      isEmail: true,
      description: 'The email address for the new account, e.g. m@example.com.',
      extendedDescription: 'Must be a valid email address.',
    },

    password: {
      required: true,
      type: 'string',
      maxLength: 200,
      example: 'passwordlol',
      description: 'The unencrypted password to use for the new account.'
    },

    fullName:  {
      required: true,
      type: 'string',
      example: 'Frida Kahlo de Rivera',
      description: 'The user\'s full name.',
    },

    avatar: {

    }

  },


  exits: {

    success: {
      description: 'New user account was created successfully.'
    },

    invalid: {
      responseType: 'badRequest',
      description: 'The provided fullName, password and/or email address are invalid.',
      extendedDescription: 'If this request was sent from a graphical user interface, the request '+
      'parameters should have been validated/coerced _before_ they were sent.'
    },

    emailAlreadyInUse: {
      statusCode: 409,
      description: 'The provided email address is already in use.',
    },

  },


  fn: async function (inputs) {

    var newEmailAddress = inputs.emailAddress.toLowerCase();

    // must do this even if inputs.avatar is not required
    const avatarInfo = await sails.uploadOne(inputs.avatar);

    // Build up data for the new user record and save it to the database.
    // (Also use `fetch` to retrieve the new ID so that we can use it below.)
    var newUserRecord = await User.create(_.extend({
      emailAddress: newEmailAddress,
      password: await sails.helpers.passwords.hashPassword(inputs.password),
      fullName: inputs.fullName,
      tosAcceptedByIp: this.req.ip,
      avatarFd: avatarInfo.fd,
      avatarMime: avatarInfo.type
    }, sails.config.custom.verifyEmailAddresses? {
      emailProofToken: await sails.helpers.strings.random('url-friendly'),
      emailProofTokenExpiresAt: Date.now() + sails.config.custom.emailProofTokenTTL,
      emailStatus: 'unconfirmed'
    }:{}))
    .intercept('E_UNIQUE', 'emailAlreadyInUse')
    .intercept({name: 'UsageError'}, 'invalid')
    .fetch();

    // If billing feaures are enabled, save a new customer entry in the Stripe API.
    // Then persist the Stripe customer id in the database.
    if (sails.config.custom.enableBillingFeatures) {
      let stripeCustomerId = await sails.helpers.stripe.saveBillingInfo.with({
        emailAddress: newEmailAddress
      }).timeout(5000).retry();
      await User.updateOne(newUserRecord.id)
      .set({
        stripeCustomerId
      });
    }

    // Store the user's new id in their session.
    this.req.session.userId = newUserRecord.id;

    if (sails.config.custom.verifyEmailAddresses) {
      // Send "confirm account" email
      await sails.helpers.sendTemplateEmail.with({
        to: newEmailAddress,
        subject: 'Please confirm your account',
        template: 'email-verify-account',
        templateData: {
          fullName: inputs.fullName,
          token: newUserRecord.emailProofToken
        }
      });
    } else {
      sails.log.info('Skipping new account email verification... (since `verifyEmailAddresses` is disabled)');
    }

    // add to pubilc group
    const publicGroup = await Group.fetchPublicGroup();
    await Group.addMember(publicGroup.id, newUserRecord.id);


  }

};
...