我将nodejs与express作为rest api一起使用,在客户端,我将jQuery(ajax)用于http请求。 当用户执行登录请求时,服务器将用户对象作为正文和标头中的x-auth令牌返回。 问题是由于某种原因,我没有在响应数据中看到x-auth标头。 服务器端代码:
//POST api/login
app.post('/api/login', (req, res) => {
var body = _.pick(req.body, ['email', 'password'])
console.log(body)
var user;
User.findByCredentials(body.email, body.password).then((result) => {
user = result
return user.generateAuthToken()
}).then((token) => {
// as you see i put the token here as header, and it is not null i
// made debugging.
res.status(200).header('x-auth', token).send(user)
}).catch((e) => {
res.status(400).send('Unauthorized')
})
})
客户端代码:
let loginRequest = {
"email":username,
"password":password
}
loginRequest = JSON.stringify(loginRequest)
console.log(loginRequest)
var res = $.ajax({
url:"http://192.168.1.22:3000/api/login",
method: "POST",
data: loginRequest,
contentType: "application/json;charset=utf-8",
dataType: 'json',
cache: false,
success: function(user, status, response){
console.log('Login success :'+status);
console.log(user.fullName +", role: "+user.role)
//i try to print all the headers here but it not contain the x-auth
console.log(`${response.getAllResponseHeaders()}`)
},
error: function(e){
console.log("login error, status: "+e.status +" message :
"+e.responseText);
}
})
当我打印所有标题时:response.getAllResponseHeaders()
结果是:content-type: application/json; charset=utf-8
我也有此api的android客户端,在android中,我确实有x-auth标头。 我会怀念ajax吗?
答案 0 :(得分:0)
经过数百次尝试,我发现由于这是CORS请求,因此需要在服务器端将Access-Control-Expose-Headers
添加到res.header
用于服务器中的快速中间件的完整代码:
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*")
res.header('Access-Control-Expose-Headers', 'x-auth'); //added this line
res.header("Access-Control-Allow-Headers", "Origin, headers, X-Requested-With, Content-Type, contentType, Accept, x-auth");
next()
})
答案 1 :(得分:0)
我认为您的代码一切正常,问题出在跨源资源共享。在向url:"http://192.168.1.22:3000/api/login"
发出发布请求之前,浏览器会检查API(服务器)中是否可以从外部访问传入请求,如果可以,则您的请求将被发送到服务器。为了启用来自外部的传入请求,您应该使用cors