从Express app返回JSON:Uncaught(在promise中)SyntaxError:意外的输入结束

时间:2016-08-26 13:18:25

标签: javascript json express

我需要一双新鲜的眼睛。

我正在尝试使用一个简单的Express应用程序来返回一些json(它恰好是Firebase令牌,但这不相关)每次发出请求时。

这是我的Express服务器代码:

app.get('/validate', function (req, res) {
  var customToken = firebase.auth().createCustomToken(req.query.token);
  res.json({
    token: customToken
  });
});

app.listen(8000, function () {
  console.log('Listening on port 8000');
});

这是来自客户端的请求(侦听端口3000):

export function login() {
    return fetch('http://localhost:8000/validate?token=666', {
      method: 'GET',
      mode: 'no-cors',
      headers: new Headers({
          'Authorization': apiClient.headers.Authorization,
          'Content-Type': 'application/json'
        })
      })
      .then(response => console.log('RESPONSE: ', response.json()))
      .catch(response => console.error('ERROR: ', response));
  }

Express应用似乎工作正常,因为当我在浏览器中打开http://localhost:8000/validate?token=666时,我可以看到我需要的json。

但是,当我发出客户端请求时,我收到此错误

Uncaught (in promise) SyntaxError: Unexpected end of input

这就是响应日志的样子

RESPONSE:  Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: SyntaxError: Unexpected end of input
    at SyntaxError (native)
    at eval (eval at <anonymous> (h…}__proto__: Promise[[PromiseStatus]]: "rejected"[[PromiseValue]]: SyntaxError: Unexpected end of input
    at SyntaxError (native)
    at eval (eval at <anonymous> (http://localhost:3000/main.js:1381:2), <anonymous>:78:42)message: "Unexpected end of input"stack: "SyntaxError: Unexpected end of input↵    at SyntaxError (native)↵    at eval (eval at <anonymous> (http://localhost:3000/main.js:1381:2), <anonymous>:78:42)"get stack: stack()set stack: stack()__proto__: Error
login.js?b88c:54

任何关于我做错的指示都将不胜感激。

2 个答案:

答案 0 :(得分:1)

有一个类似的问题,经过一些研究,我意识到{ mode: 'no-cors' }存在的唯一原因是不能直接访问的不透明响应。要访问响应,您需要使用Cache API对其进行缓存,然后再与服务工作者一起使用。

我最后通过将Access-Control-Allow-Origin: *标题添加到我的服务器端来解决这个问题(确保此设置对您来说在生产中是安全的,并且您绝对相信您是唯一能够提出请求的人到您的服务器)+从请求中删除mode:'no-cors'选项。

答案 1 :(得分:0)

如果它对任何人有帮助,我已经通过添加

解决了我的问题
app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

到服务器端代码。