如何使用Node.js读取上传到Google云存储的JSON文件的内容

时间:2018-08-22 15:26:09

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

我通过创建一个新项目将JSON文件手动上传到Google云存储。我可以读取文件的元数据,但是我不知道如何读取JSON内容

我用来读取元数据的代码是            var Storage = require('@google-cloud/storage'); const storage = Storage({ keyFilename: 'service-account-file-path', projectId: 'project-id' }); storage .bucket('project-name') .file('file-name') .getMetadata() .then(results => { console.log("results is", results[0]) })
.catch(err => { console.error('ERROR:', err); });

有人可以指导我阅读JSON文件内容的方式

4 个答案:

答案 0 :(得分:6)

我已使用以下代码从Cloud Storage中读取json文件:

    'use strict';
    const Storage = require('@google-cloud/storage');
    const storage = Storage();
    exports.readFile = (req, res) => {
            console.log('Reading File');
            var archivo = storage.bucket('your-bucket').file('your-JSON-file').createReadStream();
            console.log('Concat Data');
            var  buf = '';
            archivo.on('data', function(d) {
              buf += d;
            }).on('end', function() {
              console.log(buf);
              console.log("End");
              res.send(buf);
            });     

    };

我正在从流中读取并将文件中的所有数据合并到buf变量。

希望有帮助。

更新

要读取多个文件,请执行以下操作:

'use strict';
const {Storage} = require('@google-cloud/storage');
const storage = new Storage();
listFiles();

async function listFiles() {
        const bucketName = 'your-bucket'
        console.log('Listing objects in a Bucket');
        const [files] = await storage.bucket(bucketName).getFiles();
        files.forEach(file => {
            console.log('Reading: '+file.name);
            var archivo = file.createReadStream();
            console.log('Concat Data');
            var  buf = '';
            archivo.on('data', function(d) {
                buf += d;
            }).on('end', function() {
                console.log(buf);
                console.log("End");
            });    
        });
};

答案 1 :(得分:5)

此版本的现代版本:

const { Storage } = require('@google-cloud/storage')
const storage = new Storage()
const bucket = storage.bucket('my-bucket')

// The function that returns a JSON string
const readJsonFromFile = async remoteFilePath => new Promise((resolve, reject) => {
  let buf = ''
  bucket.file(remoteFilePath)
    .createReadStream()
    .on('data', d => (buf += d))
    .on('end', () => resolve(buf))
    .on('error', e => reject(e))
})

// Example usage
(async () => {
  try {
    const json = await readJsonFromFile('path/to/json-file.json')
    console.log(json)
  } catch (e) {
    console.error(e)
  }
})()

答案 2 :(得分:1)

存在一种方便的方法:“下载”将文件下载到内存或本地目标位置。您可以使用以下下载方法:

const bucketName='bucket name here';
const fileName='file name here';
const storage = new Storage.Storage();
const file = storage.bucket(bucketName).file(fileName);

file.download(function(err, contents) {
     console.log("file err: "+err);  
     console.log("file data: "+contents);   
}); 

答案 3 :(得分:1)

我像其他答案一样使用createWriteStream方法,但输出出现问题,因为它随机输出字符串中某些字符的无效字符(。)。我认为可能是一些编码问题。

我想出了使用download方法的解决方法。 download方法返回一个DownloadResponse,其中包含一个Buffer数组。然后,我们使用Buffer.toString()方法并将其编码为utf8并使用JSON.parse()解析结果。

const downloadAsJson = async (bucket, path) => {
  const file = await new Storage()
    .bucket(bucket)
    .file(path)
    .download();
  return JSON.parse(file[0].toString('utf8'));
}