服务器在某些路由上抛出500错误

时间:2019-07-25 17:05:21

标签: javascript node.js express

我一直在做一些小型学校项目,以制作我们自己的API并将其连接到有角度的前端。

我一直在遵循有关操作的指南,并且遇到了以下问题:我的应用在实现控制器后开始引发内部服务器错误500。

在导入用于用户注册的控制器之前,一切工作正常。 Posts控制器工作正常,ap的登录部分也是如此

我尝试记录错误,但不会输出任何内容。

这是我的代码:

用户路线

const express = require("express");

const UserController = require("../controllers/user");

const router = express.Router();

router.post("/signup", UserController.createUser);

router.post("/login", UserController.userLogin);

module.exports = router;

用户控制器

const bcrypt = require("bcrypt");
const jwt = require("jsonwebtoken");

const User = require("../models/user");

exports.createUser = (req, res, next) => {
  bcrypt.hash(req.body.password, 10).then(hash => {
    const user = new User({
      email: req.body.email,
      password: hash
    });
    user
      .save()
      .then(result => {
        res.status(201).json({
          message: "User created!",
          result: result
        });
      })
      .catch(err => {
        res.status(500).json({
          message: "Invalid authentication credentials!"
        });
      });
  });
}

exports.userLogin = (req, res, next) => {
  let fetchedUser;
  User.findOne({ email: req.body.email })
    .then(user => {
      if (!user) {
        return res.status(401).json({
          message: "Auth failed"
        });
      }
      fetchedUser = user;
      return bcrypt.compare(req.body.password, user.password);
    })
    .then(result => {
      if (!result) {
        return res.status(401).json({
          message: "Auth failed"
        });
      }
      const token = jwt.sign(
        { email: fetchedUser.email, userId: fetchedUser._id },
        "b9SNz3xg9gjY",
        { expiresIn: "1h" }
      );
      res.status(200).json({
        token: token,
        expiresIn: 3600,
        userId: fetchedUser._id
      });
    })
    .catch(err => {
      return res.status(401).json({
        message: "Invalid authentication credentials!"
      });
    });
}

我希望能够注册一个能够发布新帖子的帐户。一切正常,直到我制作了控制器并将请求和功能移到控制器文件中为止。

我很抱歉提出这个可能很简单的问题,但是我的编程技巧仍然很低

1 个答案:

答案 0 :(得分:1)

userLogin中,当user不存在时,您返回res.status(401)...,它以.then的形式链接到下一个result调用(代替您期望它是bcrypt.compare返回的值。

您可以做什么,而不是:

  if (!user) {
    return res.status(401).json({
      message: "Auth failed"
    });
  }

尝试

  if (!user) {
    throw new Error("Auth failed");
  }

将被捕获到您的.catch中。