Javascript 当邮递员工作时,Ajax请求不断失败,请求错误
所以我已经研究了好几个小时,尝试了不同的东西,研究了好几个小时都没有结果。调用是在提供user和pass之后获取JWT令牌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
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”