我有一个节点应用程序,它为反应应用程序提供服务并向 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();
}
}
});
});
请参阅此答案https://stackoverflow.com/a/38258590/4348875,确保 err.code 是有效的 HTTP 状态代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句