Javascript 当邮递员工作时,Ajax请求不断失败,请求错误

Javascript 当邮递员工作时,Ajax请求不断失败,请求错误,javascript,ajax,postman,Javascript,Ajax,Postman,所以我已经研究了好几个小时,尝试了不同的东西,研究了好几个小时都没有结果。调用是在提供user和pass之后获取JWT令牌 function listenForLogin() { console.log('listening') $('#submit-btn').on('click', e => { e.preventDefault(); console.log('button-pressed'); const username = $('#use

所以我已经研究了好几个小时,尝试了不同的东西,研究了好几个小时都没有结果。调用是在提供user和pass之后获取JWT令牌

function listenForLogin() {
    console.log('listening')
    $('#submit-btn').on('click', e => {
    e.preventDefault();
    console.log('button-pressed');

    const username = $('#user-input').val().trim();
    const password = $('#pass-input').val().trim();

    var user = {}
    user.username = username;
    user.password = password
    console.log(user);
    $('#user-input').val('');
    $('#pass-input').val('');

    authenticateUser(user);
});
}



//send to autenticate
function authenticateUser(user) {
    console.log('trying to authenticate');
    const settings = {
        url:"/api/auth/login",
        data: JSON.stringify(user),
        dataType: "json",
        method:"POST",
        success: (data) => {
            console.log('authenticated user');
            redirectWithToken(data.authToken, user);
        },
        error: (err) => console.log(err)
    }
    $.ajax(settings);

} 
当它点击服务器时,morgan看到有一个请求,但我得到的状态是400。这是我的路线

'use strict';

const express = require('express');
const passport = require('passport');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');
const {JWT_SECRET, JWT_EXPIRY} = require('dotenv').config();

const router = express.Router();

const createAuthToken = function(user) {

  return jwt.sign({user}, 'shade', {
    subject: user.username,
    expiresIn: '7d',
    algorithm: 'HS256'
  });
};

const localAuth = passport.authenticate('local', {session: false});

router.use(bodyParser.json());

router.post('/login', localAuth, (req, res) => {
  const authToken = createAuthToken(req.user.serialize());
  res.json({authToken});
});

const jwtAuth = passport.authenticate('jwt', {session: false});

router.post('/refresh', jwtAuth, (req, res) => {
    console.log('refresh targeted');
    const authToken = createAuthToken(req.user);
    res.json({authToken});
});

router.get('/dashboard/:user', jwtAuth, (req, res) => {
    res.redirect(`https:flow-state.herokuapp.com/dashboard/${req.params.user}`);
})

module.exports = router; 
我很难理解passport.authenticate('localAuth')是如何工作的,所以这里是我的策略文件,以备您需要

更新:我在检查fiddler上的请求时遇到了某种错误

响应字节(按内容类型) ~headers~:132 例如:11


有人知道这意味着什么吗?

您是否错过了ajax设置中的内容类型? 在ajax设置中添加
contentType:“application/json”
,然后重试

注:

dataType
定义服务器响应的预期数据类型


contentType
定义将发送到服务器的内容的数据类型。默认值是:“application/x-www-form-urlencoded”

8小时后,一个让人头疼的问题是解决方案就在这里@vignz.pie您是对的,但我需要在标题中发送“Content Type”:“application/json”以及strigify数据设置processData:false。谢谢你的帮助

function listenForLogin() {
    console.log('listening')

    $('#submit-btn').on('click', e => {

    e.preventDefault();
    console.log('button-pressed');

    const username = $('#user-input').val().trim();
    const password = $('#pass-input').val().trim();

    $('#user-input').val('');
    $('#pass-input').val('');

    authenticateUser(username, password);

    });
}



//send to autenticate
function authenticateUser(user, pass) {
    var info = {
        username: user,
        password: pass
    };
    console.log(info)
    const settings = {
        url:"/api/auth/login",
        headers: {
            "Content-Type": "application/json" 
        },
        data: JSON.stringify(info),
        processData: false,
        dataType: "json",
        method:"POST",
        success: (data) => {
            console.log('authenticated user');
            redirectWithToken(data.authToken, user);
        },
        error: (err) => console.log(err)
    }
    $.ajax(settings);

}

如果它在postman中起作用,在fiddler中捕获请求并将其与您的JS请求进行比较,您应该会很快看到我使用fetch的不同之处,因此我不会回答,但我认为“POST”应该是“POST”,如果我记得我在jQuery中工作的时候,但我不能确定。此外,如果您在本地测试环境中,则需要CORS模式。CORS已经设置好,并且在fiddler上我确实发现了一些看起来可疑的响应字节(按内容类型)------~headers~:132~???~:11您不需要执行
JSON.stringify
,只需直接传递JSON对象,这仍然是通过ajax发送查询字符串,而不是对象。我认为这最终是个问题,但我不知道如何更正ajax中的认证url,指向外部服务器?如果是,则必须在ajax请求中为CORS()设置标题:
Access Control Allow Origin:“*”,Access Control Allow headers:“Content Type”