Как исправить этот контроллер авторизации и заставить его работать правильно в Node js (Express)? - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь отправить подтверждение по электронной почте с отправителем узла и отправить сетку, когда пользователь зарегистрируется.Я реализовал необходимые функции внутри функции создания пользователя.Также добавлены некоторые части в функцию входа в систему, чтобы проверить, проверена ли электронная почта пользователя, и только после этого позволяют им войти в систему. Однако, он показывает некоторые синтаксические ошибки в контроллере аутентификации, и я не могу понять, что именно не так?Вот код:

Auth Controller

module.exports = {
  async CreateUser(req, res) {
    const schema = Joi.object().keys({
      username: Joi.string()
        .min(4)
        .max(10)
        .required(),
      email: Joi.string()
        .email()
        .required(),
      password: Joi.string()
        .min(5)
        .required(),
    });

    const { error, value } = Joi.validate(req.body, schema);
    if (error && error.details) {
      return res.status(HttpStatus.BAD_REQUEST).json({ msg: error.details })
    }

    const userEmail = await User.findOne({
      email: Helpers.lowerCase(req.body.email)
    });
    if (userEmail) {
      return res
        .status(HttpStatus.CONFLICT)
        .json({ message: 'Email already exist' });
    }

    const userName = await User.findOne({
      username: Helpers.firstUpper(req.body.username)
    });
    if (userName) {
      return res
        .status(HttpStatus.CONFLICT)
        .json({ message: 'Username already exist' });
    }

    return bcrypt.hash(value.password, 10, (err, hash) => {
      if (err) {
        return res
          .status(HttpStatus.BAD_REQUEST)
          .json({ message: 'Error hashing password' });
      }

      const body = {
        username: Helpers.firstUpper(value.username),
        email: Helpers.lowerCase(value.email),
        password: hash,
      };
      User.create(body)
        .then(user => {
          const token = jwt.sign({ data: user }, dbConfig.secret, {
            expiresIn: '5h'
          });
          res.cookie('auth', token);
          res
            .status(HttpStatus.CREATED)
            .json({ message: 'User created successfully', user, token });
            var token = new Token({ _userId: user._id, token: crypto.randomBytes(16).toString('hex') });
            token.save(function (err) {
              if (err) { return res.status(500).send({ msg: err.message }); }
              var transporter = nodemailer.createTransport({
              service: 'Sendgrid',
              auth: { user: process.env.SENDGRID_USERNAME, pass: process.env.SENDGRID_PASSWORD } });
              var mailOptions = {
                 from: 'no-reply@yourwebapplication.com',
                  to: user.email, subject: 'Account Verification Token',
        text: 'Hello,\n\n' + 'Please verify your account by clicking the link: \nhttp:\/\/' + req.headers.host + '\/confirmation\/' + token.token +
              transporter.sendMail(mailOptions, function (err) {
                if (err) { return res.status(500).send({ msg: err.message }); }
                res.status(200).send('A verification email has been sent to ' + user.email + '.');
              })
            })
        })
        .catch(err => {
          res
            .status(HttpStatus.INTERNAL_SERVER_ERROR)
            .json({ message: 'Error occured' });
        });
    });
  },

  async LoginUser(req, res) {
    if (!req.body.username || !req.body.password) {
      return res
        .status(HttpStatus.INTERNAL_SERVER_ERROR)
        .json({ message: 'No empty fields allowed' });
    }

    await User.findOne({ username: Helpers.firstUpper(req.body.username) })
      .then(user => {
        if (!user) {
          return res
            .status(HttpStatus.NOT_FOUND)
            .json({ message: 'Username not found' });
        }

        return bcrypt.compare(req.body.password, user.password).then(result => {
          if (!result) {
            return res
              .status(HttpStatus.INTERNAL_SERVER_ERROR)
              .json({ message: 'Password is incorrect' });
          }
          if (!user.isVerified)
          return res
          .status(HttpStatus.INTERNAL_SERVER_ERROR)
          .json({ message: 'Email is not verified' });


          const token = jwt.sign({ data: user }, dbConfig.secret, {
            expiresIn: '5h'
          });
          res.cookie('auth', token);
          return res
            .status(HttpStatus.OK)
            .json({ message: 'Login successful', user, token });
        });
      })
      .catch(err => {
        return res
          .status(HttpStatus.INTERNAL_SERVER_ERROR)
          .json({ message: 'Error occured' });
      });
  }
};

VS показывает первую синтаксическую ошибку в этой строке:

transporter.sendMail(mailOptions, function (err) {
                if (err) { return res.status(500).send({ msg: err.message }); }
                res.status(200).send('A verification email has been sent to ' + user.email + '.');
              })
            }) <====== under this ) I don't know what is wrong with it but it shows red line under that )
        })

Я нея думаю, что это единственная ошибка в этом коде.Как я могу исправить это и то, и другое, если есть другие? Вот модель:

const userSchema = mongoose.Schema({
  username: { type: String },
  email: { type: String },
  isVerified: { type: Boolean, default: false },
  password: { type: String },

и модель токена

const tokenSchema = new mongoose.Schema({
    _userId: { type: mongoose.Schema.Types.ObjectId, required: true, ref: 'User' },
    token: { type: String, required: true },
    createdAt: { type: Date, required: true, default: Date.now, expires: 43200 }
});
module.exports = mongoose.model('Token', tokenSchema);

Что бы это ни звучалобыть исправлены в этом коде, чтобы заставить функции аутентификации работать как положено?Как я могу исправить вышеупомянутые ошибки синтаксиса и другие, а также, если они видны на глаз?

1 Ответ

0 голосов
/ 14 декабря 2018

для опечатки, вы просто забыли закрыть фигурную скобку объекта mailOptions.

также убедитесь, что все время отправляете ответ клиенту только один, так что res.send () должен быть записан одинвремя, когда все обратные вызовы сделаны, с учетом обработки ошибок наверняка.

вот обновление для функции User.creat, где вы можете видеть, что место res.send изменилось:

           User.create(body)
            .then(user => {
                const token = jwt.sign({ data: user }, dbConfig.secret, {
                    expiresIn: '5h'
                });
                res.cookie('auth', token);

                var token = new Token({ _userId: user._id, token: crypto.randomBytes(16).toString('hex') });
                token.save(function (err) {
                    if (err) { return res.status(500).send({ msg: err.message }); }
                    var transporter = nodemailer.createTransport({
                        service: 'Sendgrid',
                        auth: { user: process.env.SENDGRID_USERNAME, pass: process.env.SENDGRID_PASSWORD }
                    });
                    var mailOptions = {
                        from: 'no-reply@yourwebapplication.com',
                        to: user.email, subject: 'Account Verification Token',
                        text: 'Hello,\n\n' + 'Please verify your account by clicking the link: \nhttp:\/\/' + req.headers.host + '\/confirmation\/' + token.token
                    }

                    transporter.sendMail(mailOptions, function (err) {
                        if (err) { return res.status(500).send({ msg: err.message }); }
                        res.status(HttpStatus.CREATED).json({ message: 'User created successfully', user, token }); // or you can send another response as you like here
                    })          
                })
            })
            .catch(err => {
                res
                    .status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .json({ message: 'Error occured' });
            });
...