javascript - Azure 功能不接受在远程创建文件
问题描述
我会在本地下载文件并创建一个流然后发送到 API。
在 localhost 文件通过blobClient.downloadToFile(defaultFile);
但是当我部署功能时,它找不到要流式传输的文件,所以我认为下载不会发生或位置不好。
我收到这个错误
[Error: ENOENT: no such file or directory, open 'D:\home\site\wwwroot\importPbix\exampleName.pbix'
这是我的代码
const blobServiceClient = BlobServiceClient.fromConnectionString(
process.env.CONNEXION_STRING
);
const containerClient = blobServiceClient.getContainerClient(
params.containerName
);
const blobClient = containerClient.getBlobClient(process.env.FILE_LOCATION); // get file from storage
let blobData;
var defaultFile = path.join(params.baseDir, `${params.reportName}.pbix`); // use path module
let stream;
try {
blobData = await blobClient.downloadToFile(defaultFile);
console.log(blobData);
stream = fs.createReadStream(defaultFile);
} catch (error) {
params.context.log(error);
console.log(error);
}
var options = {
method: "POST",
url: `https://api.powerbi.com/v1.0/myorg/groups/${params.groupId}/imports?datasetDisplayName=${params.reportName}`,
headers: {
"Content-Type": "multipart/form-data",
Authorization: `Bearer ${params.accessToken} `,
},
formData: {
"": {
value: stream,
options: {
filename: `${params.reportName}.pbix`,
contentType: null,
},
},
},
};
//check if file keep in mem
return new Promise(function (resolve, reject) {
request(options, function (error, response) {
if (error) {
params.context.log(error);
reject(error);
} else {
params.context.log(response);
resolve(response.body);
}
fs.unlinkSync(defaultFile);
});
});
我发现这篇文章有同样的问题,这就是我使用path
模块并将 __dirname 传递给函数的原因params.baseDir
。
解决方案
如果您想从 Azure blob 下载文件并将其作为流读取,只需尝试以下代码,在此演示中,我尝试将 .txt 文件下载到临时文件夹(您应该先在 Azure 函数上创建它)和从流中打印其内容以进行快速测试:
module.exports = async function (context, req) {
const { BlockBlobClient } = require("@azure/storage-blob")
const fs = require('fs')
const connStr = '<connection string>'
const container = 'files'
const blobName = 'test.txt'
const tempPath = 'd:/home/temp/'
const tempFilePath = tempPath + blobName
const blobClient = new BlockBlobClient(connStr,container,blobName);
await blobClient.downloadToFile(tempFilePath).then(async function(){
context.log("download successfully")
let stream = fs.createReadStream(tempFilePath)
//Print text content,just check if stream has been readed successfully
context.log("text file content:")
context.log(await streamToString(stream))
//You can call your API here...
})
function streamToString (stream) {
const chunks = [];
return new Promise((resolve, reject) => {
stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
stream.on('error', (err) => reject(err));
stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
})
}
context.res = {
body: 'done'
}
}
结果
文件已下载:
成功读取为流:
推荐阅读
- linux - 在 golang 中处理 SIGINT (ctrl-c) 以将其转换为恐慌
- variables - 变量如何在makefile中扩展?
- reactjs - 如何更好地导入 exel 文件来响应应用程序?
- html - 每秒缩放css动画而无需悬停
- python - 如何使字符串不超出pylatex中的表格
- google-sheets - importdata() 函数不起作用,尽管如此。它最近工作
- powerbi - 有没有办法将新报告发布到包含现有报告和现有数据集的工作区?
- python - Tensorboard 什么都不显示
- nonlinear-optimization - 在 OpenMDAO 中,有没有办法确保在继续计算之前遵守约束?
- kubernetes - AWS EBS 如何获取文件更改通知