我试图在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":32768,"S_IFDIR":16384,"S_IFCHR":8192,"S_IFLNK":40960,"O_CREAT":256,"O_EXCL":1024,"O_TRUNC":512,"O_APPEND":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}"
答案 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());
});
});
});