【问题标题】:Getting/Setting metadata in google cloud storage - node.js在谷歌云存储中获取/设置元数据 - node.js
【发布时间】:2020-05-07 01:40:06
【问题描述】:

我正在尝试从 Google Cloud Storage 文件中设置和检索元数据,但我尝试的方法似乎不起作用。我的代码在 Kubernetes 节点中运行/我有这个:

// let's make sure that the source file is still there.
let sourceFile = storage.bucket(sourceFileObject.bucket).file( sourceFileObject.name );

const metadata = {
      MD_DL_ERROR: 1
};

console.log( `Setting metadata for ${sourceFileObject.name} to: `, metadata );

sourceFile.setMetadata(metadata, function(err, apiResponse) {

    console.log( `NOW GETTING METADATA for: ${sourceFileObject.name}` );

    sourceFile.getMetadata( function(err, metadata, apiResponse) {
        console.log( "got metadata: ", metadata );
    } );
});

但是当它运行时,日志中的内容并没有显示任何元数据已设置的迹象:

 Setting metadata for CA-SACMLS/20022759_000.jpg to:  { MD_DL_ERROR: 1 }

 NOW GETTING METADATA for: CA-SACMLS/20022759_000.jpg
 got metadata:  { kind: 'storage#object',
   id:        'idx-photos-raw-gs.ihouseprd.com/CA-SACMLS/20022759_000.jpg/1588629892121256',
   selfLink:  'https://blah blah blah',
   mediaLink: 'https://blah blah blah',
   name: 'CA-SACMLS/20022759_000.jpg',
   bucket: 'idx-photos-raw-gs.ihouseprd.com',
   generation: '1588629892121256',
   metageneration: '2',
   contentType: 'image/jpg',
   storageClass: 'MULTI_REGIONAL',
   size: '124923',
   md5Hash: 'HASHVAL',
   crc32c: 'koOVMQ==',
   etag: 'CKiFmcObm+kCEAI=',
   timeCreated: '2020-05-04T22:04:52.120Z',
   updated: '2020-05-04T22:04:52.509Z',
   timeStorageClassUpdated: '2020-05-04T22:04:52.120Z' }

我错过了什么?

【问题讨论】:

    标签: javascript node.js google-cloud-storage metadata


    【解决方案1】:

    我认为这是由于文件元数据的修改延迟造成的(第 2 个请求被触发得非常接近且太快),我在您的代码中添加了一个睡眠功能,看起来像预期的那样工作。

    const {Storage} = require('@google-cloud/storage');
    const storage = new Storage();
    const myBucket = storage.bucket('fakebucket');
    
    //sleep definition
    const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));
    
    const sourceFileObject = myBucket.file('demo.zip');
    const metadata = {
        metadata: {
            rrasd: 'custom',
            adsdasdasd: 'go here'
        }
    };
    
    sourceFileObject.setMetadata(metadata, function(err, apiResponse) {
        //wait for the propagation
        sleep(250).then(() => {
            sourceFileObject.getMetadata(function(err, metadata, apiResponse) {
                console.log("got metadata: ", metadata);
            })
        })
    });
    };
    
    

    更新

    我更改了代码以避免 const metadata 重新定义,并且看起来像预期的那样工作,睡眠承诺不共享元数据变量,因此我之前的代码有效,感谢 @AndyWallace 的提示

      const nmetadata = {
      metadata: {
        rr123809123asd: 'custom'
      }
    };
      sourceFileObject.setMetadata(nmetadata, function(err, apiResponse) {
        sourceFileObject.getMetadata( function(err, metadata, apiResponse) {
          console.log( "got metadata: ", metadata );
        })
       });
    };
    
    

    【讨论】:

    • 谢谢,好像已经解决了。对于其他阅读解决方案的人,请注意 const 元数据的重新定义——这也是关键。烦人,但很关键。
    猜你喜欢
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2014-08-29
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    相关资源
    最近更新 更多