从ajax响应获取自定义标头

时间:2019-02-01 19:34:01

标签: jquery node.js ajax express

enter image description here enter image description here我将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吗?

2 个答案:

答案 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