如何使用Nodejs SDK从CosmosDB获取附件?

时间:2017-08-23 15:57:47

标签: node.js azure-cosmosdb

我试图在Nodejs中使用CosmosDB。我在一个集合中创建了一些文档,并为其中一个文档添加了一些附件,如下所示:

let dbds = new azure(dbEndpoint, {"masterKey":dbKey})
fs.open("c:/temp/capture.png", "r", (err, fd) => {
   if(err) console.log(err);
   else{
      dbds.createAttachmentAndUploadMedia(documentLink, fs, {contentType:"image/png", partitionKey: partitionKey}, (err, result) =>{
        fs.close(fd);
        if(err) console.log(err);
        else console.log(result);

        }
   }
}

现在,当我阅读该文档的附件时,我收到了2个附件:

dbds.readAttachments(documentLink, {"partitionKey":partitionKey}).toArray((err, result) => {
  if(err) console.log(err);
  else {
    console.log(result.length);  //2
    result.forEach(i => console.log(i.id);)  //id of each attachment
  }
}

现在我需要能够读回文档并将其存储在本地。似乎没有任何文档可以在Nodejs中找到。我尝试过以下方法:

let attachment = result[0];  //from result of toArray() above -- first attachment from list
let mediaURI = `${attachment._self}${attachment.media}`
dbds.readMedia(mediaURI, (err, result) => {
    if(err) console.log(JSON.parse(err.body).message); //Request url is invalid
    else {
        //try to write result to file
    }
}

如何为媒体创建有效的URI才能下载?

修改

根据以下评论,我更新了我的代码如下:

let attachment = result[0]
let mediaURI = attachment.media  //here is the change
dbds.readMedia(mediaURI, (err, result) => {
    if(err) console.log(JSON.parse(err.body).message);
    else {
      //try to store the data
    }
})

我不再收到错误,而是获取JSON对象:

"{"constants":{"O_RDONLY":0,"O_WRONLY":1,"O_RDWR":2,"S_IFMT"‌​:61440,"S_IFREG":327‌​68,"S_IFDIR":16384,"‌​S_IFCHR":8192,"S_IFL‌​NK":40960,"O_CREAT":‌​256,"O_EXCL":1024,"O‌​_TRUNC":512,"O_APPEN‌​D":8,"F_OK":0,"R_OK"‌​:4,"W_OK":2,"X_OK":1‌​},"F_OK":0,"R_OK":4,‌​"W_OK":2,"X_OK":1}"

2 个答案:

答案 0 :(得分:1)

我得到了微软的一些人的帮助。

主要问题是我没有正确地写文件。

而不是这个

let dbds = new azure(dbEndpoint, {"masterKey":dbKey})
fs.open("c:/temp/capture.png", "r", (err, fd) => {
   if(err) console.log(err);
   else{
      dbds.createAttachmentAndUploadMedia(documentLink, fs, {contentType:"image/png", partitionKey: partitionKey}, (err, result) =>{
        fs.close(fd);
        if(err) console.log(err);
        else console.log(result);

        }
   }
}

使用fs.open fs不是文件流 - 这是createAttachmentAndUploadMedia正在寻找的内容。我错误地认为fs是fs.open创建了一个文件流。

我最近做的是以下内容:

fs.readFile("c:/temp/myimage.jpg",(err, data) => {
    if(err) reject(err);
    else dbds.svc.createAttachmentAndUploadMedia(docPath,data,{contentType: "image/jpeg"
         , partitionKey: "Key"}, (err, result) =>{..}
})

答案 1 :(得分:0)

在您的示例中,mediaURI应该只是$ {attachment.media}而不是与$ {attachment._self}连接。

这是一个片段:

return new Promise<any>((resolve, reject) => {
    this.documentDbClient.readAttachment(docLink, options, (err, result) => {
        if (err)
            return reject(err);

        resolve(result.media);
    });
}).then((medialink) => {
    return new Promise<any>((resolve, reject) => {
        this.documentDbClient.readMedia(medialink, (err, result) => {
            if (err)
                return reject(err);

            // buffered data    
            const data = [];
            result.on('data', (chunk) => data.push(chunk));

            result.on('end', () => {
                resolve(data.join(''));
            });

            // if not buffered
            // resolve(result.toString());
        });
    });
});