2014-10-14 6 views
1

Я использую 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 как раньше. Что мне не хватает?

ответ

2

Некоторые пункты:

  • Внутри new Promise(function(res, rej){ … }) распознавателя обратного вызова, вы на самом деле нужно вызоваresolve() или reject() (асинхронно), не return ничего.
  • resolve ничего не возвращает. Вы, похоже, использовали его как операцию ожидания, которая возвращает результат обещания, но это невозможно. Обещание остается асинхронным.
  • На самом деле, вам не нужно звонить вообще new Promise. Вместо этого используйте Promisification.

Ваш код должен выглядеть довольно

var gcloud = require('gcloud'); 
Promise.promisifyAll(gcloud); // if that doesn't work, call it once on a 
           // specific bucket instead 

function getSignedUrl(url) { 
    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 }); 

    options.action = 'read'; 
    options.expires = expires; // 2 weeks. 
    options.resource = url; 
    return bucket.getSignedUrlAsync(options).catch(function(err) { 
     return url; // ignore errors and use the url instead 
    }).then(function(signed_url) { 
     console.log("This is now defined: " + signed_url); 
     return JSON.stringify({url: signed_url, expires: expires}); 
    }); 
} 
Смежные вопросы