节点服务器中未处理的承诺拒绝,仅在Heroku上,在本地工作

时间:2017-05-26 22:20:29

标签: node.js heroku

我有一个节点应用程序,可以为react应用程序提供服务,并向Google云端存储提出请求。该应用程序在本地完美运行,但在我将其部署到Heroku之后,每当我向任何端点发出请求时,我都会收到以下错误:

2017-05-26T21:53:34.426234+00:00 app[web.1]: app.post /upload_url Endpoint
2017-05-26T21:53:34.484393+00:00 app[web.1]: (node:34) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): RangeError: Invalid status code: 0

第一行是控制台日志,用于检查是否到达端点,第二行是错误。这是/upload_url端点的代码:

app.post('/upload_url', (req, res) => {
  console.log("app.post /upload_url Endpoint");
  var originalFileName = req.body["originalFileName"];
  var buf = crypto.randomBytes(16);
  var uniqueFilename = buf.toString('hex') + '_' + originalFileName;
  var file = bucket.file(uniqueFilename);

  file.createResumableUpload(function (err, uri) {
    if (!err) {
      var json = JSON.stringify({
        uri: uri,
        uniqueFilename: uniqueFilename,
        originalFileName: originalFileName
      }); 
      res.writeHead(200)
      res.end(json);
    } else {
      res.writeHead(err.code);
      res.end();
    }
  });
});

此端点由反应前端调用,具有以下提取调用:

function upload(file) {
  var data = new FormData();
  data.append('file', file);
  return fetch(`upload_url`,{
    method: 'POST',
    headers: new Headers({
      "Content-Type": "application/json",
    }),
    body: JSON.stringify({
        originalFileName: file.name
    })
   });
  }
}

同样,这在开发中工作正常,但在部署到Heroku之后却没有。我已经尝试过Heroku的建议,即在没有任何运气的情况下为应用添加并发性(详细here)。任何关于如何解决这个问题的想法或建议都将非常感激。

编辑:

bucket是一个谷歌云存储桶,定义如下:

const gcs = require('@google-cloud/storage')({
  projectId: 'my-project',
  keyFilename: process.env.GCS_KEYFILE
});
var bucket = gcs.bucket('my-bucket');

解答:

虽然这并没有完全解决我的问题,但通过更合理地处理响应错误代码,我能够确定我的实际问题与谷歌云身份验证有关。这是我更新的upload_url端点:

file.createResumableUpload(function (err, uri) {
  if (!err) {
    var json = JSON.stringify({
      uri: uri,
      uniqueFilename: uniqueFilename,
      originalFileName: originalFileName
    });
    res.writeHead(200)
    res.end(json);
  } else {
    if (err.code >= 100 && err.code < 600){
      console.error(err)
      res.writeHead(err.code);
      res.end();
    }else{
      console.error(err)
      res.writeHead(500);
      res.end();
    }
  }
 });
});

1 个答案:

答案 0 :(得分:1)

请参阅此答案https://stackoverflow.com/a/38258590/4348875,确保err.code是有效的HTTP状态代码。