javascript - 尝试登录到express和node.js内置的身份验证系统时出现404错误(文件未找到)

标签 javascript jquery node.js ajax express

我正在制作一个演示银行应用程序,它支持用户使用express.js和node.js注册和登录。 当通过 Postman 调用时,构建的 api 接受对 /signup/authenticate 路由的 POST 请求,但当通过登录表单上的 $.ajax 调用时,/authenticate 路由会给出 404 错误。

这是index.html中的jQuery ajax请求

$.ajax({
        url: '/authenticate',
        method: 'POST',
        data: cred,
        dataType: 'json',
        processData: false,
        contentType: false,
        success: function(success){
          console.log(success);
        },
        error: function(err){
          console.log(err);
        }
      })

server.js 这是服务器文件

app.use(express.static(__dirname + '/../public'));

app.get('/', function (req, res) {
    res.sendFile(path.join(__dirname + '/../public/index.html'));
});

app.use('/api', api(passport));

这是完成路由的app.js

'use strict';

var router = require('express').Router();

var config = require('../config'),
    allowOnly = require('../services/routesHelper').allowOnly,
    AuthController = require('../controllers/authController'),
    UserController = require('../controllers/userController'),
    AdminController = require('../controllers/adminController');

var APIRoutes = function(passport) {
    // POST Routes.
    router.post('/signup', AuthController.signUp);
    router.post('/authenticate', AuthController.authenticateUser);

    // GET Routes.
    router.get('/profile', passport.authenticate('jwt', { session: false }), allowOnly(config.accessLevels.user, UserController.index));
    router.get('/admin', passport.authenticate('jwt', { session: false }), allowOnly(config.accessLevels.admin, AdminController.index));

    return router;
};

module.exports = APIRoutes;

/signup 的 POST 请求有效,但在使用 Ajax 时,/authenticate 给出 404 错误。但是使用 Postman 时 /authenticate 可以按预期工作。

这是 authController.js

var jwt = require('jsonwebtoken');

var config = require('../config'),
    db = require('../services/database'),
    User = require('../models/user');

// The authentication controller.
var AuthController = {};

// Register a user.
AuthController.signUp = function(req, res) {
    if(!req.body.username || !req.body.password) {
        res.json({ message: 'Please provide a username and a password.' });
    } else {
        db.sync().then(function() {
            var newUser = {
                username: req.body.username,
                password: req.body.password
            };

            return User.create(newUser).then(function() {
                res.status(201).json({ message: 'Account created!' });
            });
        }).catch(function(error) {
            console.log(error);
            res.status(403).json({ message: 'Username already exists!' });
        });
    }
}

// Authenticate a user.
AuthController.authenticateUser = function (req, res) {
  if (!req.body.username || !req.body.password) {
    res.status(404).json({
      message: 'Username and password are needed!'
    });
  } else {
    var username = req.body.username,
      password = req.body.password,
      potentialUser = {
        where: {
          username: username
        }
      };

    User.findOne(potentialUser).then(function (user) {
      if (!user) {
        res.status(404).json({
          message: 'Authentication failed!'
        });
      } else {
        user.comparePasswords(password, function (error, isMatch) {
          if (isMatch && !error) {
            var token = jwt.sign({
                username: user.username
              },
              config.keys.secret, {
                expiresIn: '30m'
              }
            );

            res.json({
              success: true,
              token: 'JWT ' + token,
              role: user.role
            });
          } else {
            console.log("Log err")
            res.status(404).json({
              message: 'Login failed!'
            });
          }
        });
      }
    }).catch(function (error) {
      res.status(500).json({
        message: 'There was an error!'
      });
    })
  }
}


module.exports = AuthController;

这是响应日志。

POST /api/authenticate 404 5.092 ms - 47

Executing (default): SELECT id, username, password, role, createdAt, updatedAt FROM users AS user WHERE user.username = 'sipho' LIMIT 1;

POST /api/authenticate 200 519.020 ms - 193

我已经尝试了一切。请帮忙,因为我对 Node 和 Express 很陌生。

最佳答案

当路径与任何人声明的不匹配时,快速响应 404。但就你而言,我认为这是正确的。 至于您在多个地方返回 404 代码,我检查错误的方式如下:

  • 通过日志确保执行已进入您的方法

  • 编写不同的日志/控制台来了解返回的是哪个 404。或者您可以在每个地方返回不同的 http 代码,以便找到失败的地方

  • 之后,您必须检查为什么会进入这种情况,并尝试找到错误的根源。

例如。如果返回的 404 是第一个,可能是因为在 ajax 部分中您没有发送用户名或密码。如果是第二个,可能是因为用户名没有注册或保存在您的数据库中。

希望对你有帮助

关于javascript - 尝试登录到express和node.js内置的身份验证系统时出现404错误(文件未找到),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48003163/

相关文章:

javascript - jquery中的滚动绑定(bind)问题

javascript - Jquery .after() 未按预期插入

javascript - 如何使用express js 3.X和Angular js将图像流式传输到亚马逊s3?

javascript - 使用 javascript 将 css 应用于 iframe(无法控制此域)

javascript - 如何避免 JavaScript 中的无限循环

javascript - Jquery取消选中用户最后选择的选项

node.js - lwip.open 在 mongoose findOne 之后不起作用

javascript - 制作Get api时显示错误信息

javascript - 无法将 DIV 元素居中

javascript - 如何制作一个 Google Chrome 小书签来填充 URL 中的某个位置?