Я использую node-gcloud https://github.com/GoogleCloudPlatform/gcloud-node для взаимодействия с облачным хранилищем Google.Node.js синхронный вызов node-gcloud
Я разрабатываю сервер node.js (мой первый проект node.js), чтобы предоставить небольшой набор API-интерфейсов клиентам. В основном, когда пользователь загружает файл, вызов API возвращает подписанный URL-адрес, чтобы показать этот файл.
Функция getSignedUrl является асинхронной https://googlecloudplatform.github.io/gcloud-node/#/docs/v0.8.1/storage?method=getSignedUrl, и я не могу найти способ вернуть этот результат из другой функции.
Я начал играть с обещаниями Bluebird, но я не могу понять. Вот мой код:
var _signedUrl = function(bucket,url,options) {
new Promise(function (resolve, reject) {
var signed_url
bucket.getSignedUrl(options, function(err, url) {
signed_url = err || url;
console.log("This is defined: " + signed_url)
return signed_url
})
})
}
var _getSignedUrl = function(url) {
new Promise(function(resolve) {
var options = config.gs
, expires = Math.round(Date.now()/1000) + (60 * 60 * 24 * 14)
, bucket = project.storage.bucket({bucketName: config.gs.bucket, credentials: config.gs })
, signed_url = null
options.action = 'read'
options.expires = expires// 2 weeks.
options.resource= url
signed_url = resolve(_signedUrl(bucket,url,options))
console.log("This is undefined: " + signed_url)
return JSON.stringify({url: signed_url, expires: expires});
});
}
Я думаю, что я пропускаю основы того, как он должен работать, так что любой намек будет оценен.
Edit:
Я переработан мое решение, как для первого комментария:
getSignedUrl: function() {
var options = config.gs
, expires = Math.round(Date.now()/1000) + (60 * 60 * 24 * 14)
, bucket = project.storage.bucket({bucketName: config.gs.bucket, credentials: config.gs })
, signed_url = null
options.action = 'read'
options.expires = expires// 2 weeks.
options.resource= this.url
Promise.promisifyAll(bucket);
return bucket.getSignedUrlAsync(options).catch(function(err) {
return url; // ignore errors and use the url instead
}).then(function(signed_url) {
return JSON.stringify({url: signed_url, expires: expires});
});
}
Это не для меня ясно, как предполагается двойное возвращение на работу, но если я держу обратный ковш
что я получаю этот выход:
{URL: {_bitField: 0, _fulfillmentHandler0 не определено, _rejectionHandler0 не определено, _promise0 не определено, _receiver0 не определено, _settledValue не определено, _boundTo: не определено} }
, и если удалить его и сохранить
return JSON.stringify({url: signed_url, expires: expires});
Я получаю undefined как раньше. Что мне не хватает?