我有一个节点应用程序,可以为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();
}
}
});
});