使用NodeJS从IBM Bluemix Object Storage下载文件

使用NodeJS脚本从IBM Bluemix Object Storage下载文件时遇到问题,问题是需要很长时间才能从存储中下载文件, 100K文件需要大约21秒 ,等待第一个块大约需要8秒,然后rest阅读所有的大块

我正在使用该服务来存储图像,并使用NodeJS脚本从存储中读取这些图像,并通过HTML img标签下载图像,所以我在这里做错了什么?

nodeJS代码:

app.get("/ostore/image/:filename", function(request, response) { response.set('Content-Type', 'image/jpg'); response.set('cache-control', 'max-age=604800'); response.set('Last-Modified', 'Sat, 05 Dec 2015 03:17:48 GMT'); var credentials = app.appEnv.services['Object-Storage'][0].credentials var pkgcloud = require("pkgcloud"); var client = pkgcloud.storage.createClient({ provider: 'openstack', username: credentials.userId, password: credentials.password, authUrl: credentials.auth_url, tenantId: credentials.projectId, region: credentials.region, version: "2" }); client.download({ container: app.storageContainer, remote: request.params.filename, stream: response }, function() { response.end('done'); }); }); 

尝试这样的事情:

routes.js

 var vcap_os = require(__dirname + '/../utils/vcap')('Object-Storage'), os = require(__dirname + '/../modules/object-storage'); module.exports = function(app) { var router = app.loopback.Router(); // proxy for object storage service router.get('/api/Products/image/:container/:file', function(req, res) { os(vcap_os.credentials).download(req.params.container, req.params.file, function(download) { download.pipe(res); }); }); app.use(router); } 

模块/对象storage.js

 var pkgcloud = require('pkgcloud'); module.exports = function(creds) { var config = { provider: 'openstack', useServiceCatalog: true, useInternal: false, keystoneAuthVersion: 'v3', authUrl: creds.auth_url, tenantId: creds.projectId, domainId: creds.domainId, username: creds.username, password: creds.password, region: creds.region }; return { download: function(container, file, cbk) { var client = pkgcloud.storage.createClient(config); client.auth(function (error) { if(error) { console.error("Authorization error for storage client (pkgcloud): ", error); } else { var request = client.download({ container: container, remote: file }); cbk(request); } }); } }; }; 

使用joe的答案,几乎没有修改,现在服务工作正常,我不得不改变库pkgcloud,因为它导致bluemixvalidation问题,我切换到包装包pkgcloud-bluemix-objectstorage,我的代码看起来像现在这个:

 app.get('/ostore/image/:filename', (request, response) => { const credentials = app.appEnv.services['Object-Storage'][0].credentials; const config = {}; config.provider = 'openstack'; config.authUrl = 'https://identity.open.softlayer.com/'; config.region = credentials.region; config.useServiceCatalog = true; config.useInternal = true; config.tenantId = credentials.projectId; config.userId = credentials.userId; config.username = credentials.username; config.password = credentials.password; config.auth = { forceUri: 'https://identity.open.softlayer.com/v3/auth/tokens', interfaceName: 'public', identity: { methods: [ 'password' ], password: { user: { id: credentials.userId, password: credentials.password } } }, scope: { project: { id: credentials.projectId } } }; const client = pkgcloud.storage.createClient(config); client.auth(error => { if (error) { console.error('Authorization error for storage client (pkgcloud): ', error); } else { const download = client.download({ container: app.storageContainer, remote: request.params.filename }); download.on('response', res => { delete res.headers['content-type']; delete res.headers['last-modified']; res.headers['Last-Modified'] = 'Sat, 05 Dec 2015 03:17:48 GMT'; res.headers['Cache-Control'] = 'public, max-age=2592000'; res.headers['Expires'] = new Date(Date.now() + 2592000000).toUTCString(); res.headers['Content-Type'] = 'image/jpg'; }).pipe(response); } }); });