2017-12-28 10 views
1

사용자를 지원하는 데모 뱅킹 응용 프로그램을 만들고 express.js 및 node.js를 사용하여 로그인합니다. 빌드 된 api는 POSTman을 통해 호출 할 때 /signup/authenticate 경로로 POST 요청을 수락하지만 로그인 양식에서 $.ajax을 통해 호출하면 /authenticate 경로가 404 오류를 발생시킵니다.Express 및 node.js에 내장 된 인증 시스템에 로그인 할 때 404 오류 (파일을 찾을 수 없음)

$.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 인에게 index.html을에서 jQuery를 아약스 요청입니다

'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 요청은 작동하지만 /authenticate은 Ajax를 사용할 때 404 오류를 발생시킵니다. 그러나 /authenticate은 Postman을 사용할 때 예상대로 작동합니다.

은 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/404 5.092 MS 인증 -

(47)의 실행 (기본값) user user AS id, username, password, role, createdAt, updatedAtusers에서 선택하십시오. username = 'sipho'LIMIT 1;

POST/API/인증 (200) 519.020 밀리 - 193

나는 모든 것을 시도했다. 내가 노드와 익스프레스를 처음 사용하기 때문에 도와주세요.

답변

0

경로가 선언 한 사람과 일치하지 않으면 Express가 자동으로 응답합니다. 그러나 당신의 경우에, 나는 옳다고 선언했다고 생각합니다. 지금까지 여러 장소에서 404 코드이 나는 것이 오류를 확인하려는 방법으로 반환 될 때 :

  • 실행이 방법

  • 쓰기에 진입 로그를 확인을 다른 로그/콘솔을 사용하여 404가 반환되는지 확인합니다. 또는 어느 장소에서 다른 http 코드를 반환하여 어느 쪽이 실패했는지 찾을 수 있습니다.

  • 그런 다음 오류가 발생한 이유를 확인하고 오류의 원인을 찾아야합니다.

예를 들면. 404 반환 된 첫 번째 경우 ajax 부분에서 사용자 이름이나 암호를 보내지 않기 때문에 수 있습니다. 두 번째 경우 사용자 이름이 등록되지 않았거나 데이터베이스에 저장되지 않았기 때문일 수 있습니다.

희망 하시겠습니까?

+0

대단히 감사합니다. 예상대로 메시지 객체가 아니라 404 오류를 반환하는 것 같습니다. 어디서나'console.log' 문을 뿌려야 만 문제의 근원을 추적 할 수있었습니다. 조언 주셔서 대단히 감사합니다. – hunkpapa

관련 문제