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

快如兔

我有一个节点应用程序,它为反应应用程序提供服务并向 Google Cloud Storage 发出请求。该应用程序在本地完美运行,但在我将其部署到 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();
    }
  });
});

此端点由 react 前端使用以下 fetch 调用调用:

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 的向应用程序添加并发性的建议(在此处详细说明),但没有任何运气。非常感谢有关如何解决此问题的任何想法或建议。

编辑:

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();
    }
  }
 });
});
Yi Kai

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Heroku上设置Node.js服务器的端口

Heroku上的node.js Web服务器-不断增长的内存

Rails 4:Font Awesome在本地工作,在Heroku上中断

Docker Node.js构建在本地工作但挂在服务器上

缓存承诺导致Node.js中未处理的承诺被拒绝

React Routing在本地工作,但在Heroku中不工作

Node.js未处理的承诺拒绝

reCaptcha在本地工作,但在服务器上不工作

UnhandledPromiseRejectionWarning:Node.JS中未处理的承诺拒绝(拒绝ID:1)

MERN API GET请求在Heroku上返回404,可在本地Raspi服务器上使用

猫鼬不会在Heroku上连接到MongoDB(在本地开发环境中工作)

Heroku上未知的代币传播运营商,在本地工作

Mongodb Atlas + Node.js在本地工作,但是在推送到Heroku时停止

CSS在本地服务器上运行,但在Heroku服务器上不运行

在Heroku上使用TemplateDoesNotExist,但可在本地服务器上使用

Node.js + Express仅在测试服务器上的端口3000上工作

heroku记录--tail错误消息:本地服务器正常工作,但Heroku不能

Heroku上带有Gunicorn的Bottle应用-工头在本地工作,但在Heroku上不工作

CSS图标在应用程序中本地工作,但未在Heroku上显示吗?

适用于Node.js的Canvas在本地工作,但不在Heroku服务器上

node-cron在我的服务器上不工作

应用程序在本地工作,但不在 heroku 上

Heroku 上的 UDP 服务器

Express 服务器在本地工作但在 heroku 上崩溃

请求在本地工作但未部署在 Heroku 上

Heroku 上的节点 HTTP 服务器

Node.js express 服务器在本地主机上运行,但在 Heroku 主机上有问题

从本地或 Heroku/部署的服务器获取

从heroku服务器上的node.js应用程序连接远程mysql数据库时出现ETIMEDOUT