Как я могу обработать данные / json, которые я извлекаю из моего веб-сервиса API (ExpressJS)? - PullRequest
0 голосов
/ 23 января 2020

Я новичок в NodeJS и ExpressJS. Я создал AuthController, который обрабатывает сообщение входа в систему.

exports.login = async (req, res, next) => {
try {
    const email = req.body.email;
    const password = req.body.password;

    const user = await User.findOne({ email }).select("+password");
    if (!user) {
        const error = new Error("Wrong Credentials");
        error.statusCode = 401;
        throw error;            
    }

    const validPassword = await user.validPassword(password);
    if (!validPassword) {
        const error = new Error("Wrong Credentials");
        error.statusCode = 401;
        throw error;      
    }

    const token = jwt.encode({id: user.id}, config.jwtSecret);
    res.send({user, token});
} catch(err) {
    next(err);
}
}

Я хотел бы использовать этот метод в своем веб-приложении, чтобы позволить пользователю войти в систему. Если пользователь успешно входит в систему, я получаю ответ json в своем браузере с пользователем и токеном. Это не то, что я хочу. URL для входа в API: / api / auth / login. Я создал функцию в своем веб-приложении:

router.post('/login', async (req, res, next) => {
    var apiResponse = await authController.login(req, res, next);
    res.render('profile.ejs', {user: apiResponse.user});
});

Я получаю сообщение об ошибке, что authController.login не является функцией. У меня вопрос, как я могу использовать метод из моего API и использовать ответ в моем веб-приложении? Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 23 января 2020

Вы можете сделать это , как показано ниже: ?

router.post('/login', authController.login, async (req, res, next) => {
    res.render('profile.ejs', {user: apiResponse.user});
});

?‍? Пожалуйста, прочтите документацию о Express Middleware .

Обновлено: Middleware

Убедитесь, что ваш authController выглядит следующим образом:

exports.login = async (req, res, next) => {
  try {
      const email = req.body.email;
      const password = req.body.password;

      const user = await User.findOne({ email }).select("+password");
      if (!user) {
          const error = new Error("Wrong Credentials");
          error.statusCode = 401;
          throw error;            
      }

      const validPassword = await user.validPassword(password);
      if (!validPassword) {
          const error = new Error("Wrong Credentials");
          error.statusCode = 401;
          throw error;      
      }

      const token = jwt.encode({id: user.id}, config.jwtSecret);
      // passing your data to next function
      // you can change exampleData with the 'variable' you want
      req.exampleData = { user, token }
      next();
  } catch(err) {
      next(err);
  }
}

Если ваш authController такой же root ("папка") с вашими маршрутами, чем это выглядит так:

const { login } = require('./authController');

Итак, теперь вы можете вызывать authController следующим образом:

router.post('/login', login, async (req, res, next) => {
  // your data: "user" and "token" from middleware
  const { exampleData } = req;
  console.log(exampleData);
  res.render('profile.ejs', {user: exampleData});
});

Надеюсь, это поможет вам ?.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...