Azure Functions:Nodejs,使用文件系统时有哪些限制?
Azure Functions: Nodejs, What are restrictions / limitations when using file system?
我无法使使用节点文件系统模块的 azure 函数正常工作。
我创建了一个具有最基本 HTTP 触发功能的全新功能应用程序,并包含 'fs' 模块:
var fs = require('fs');
module.exports = function (context, req, res) {
context.log('function triggered');
context.log(req);
context.done();
}
这很好用。我在直播日志和函数调用列表中看到了完整的请求。
但是,一旦我添加实际使用文件系统的代码,它似乎崩溃 azure 函数。 它既不完成也不抛出错误。它似乎也没有出现在 azure 函数调用列表中,这很可怕,因为这是失败信息的丢失,我可能认为我的服务 运行 在实际发生崩溃时很好。
var fs = require('fs');
module.exports = function (context, req, res) {
context.log('function triggered');
context.log(req);
fs.writeFile('message.txt', 'Hello Node.js', (err) => {
if (err) throw err;
console.log('It\'s saved!');
context.done();
});
}
fs.writeFile
代码直接取自node.js网站:
https://nodejs.org/dist/latest-v4.x/docs/api/fs.html#fs_fs_writefile_file_data_options_callback
我在回调中添加了 context.done()
,但该代码片段在正常的开发环境中应该可以正常工作。
这提出了问题:
- 使用Azure Functions时是否可以使用文件系统?
- 如果可以,有什么限制?
- 如果没有限制,开发人员是否需要跟踪和执行
清理还是由一些沙箱处理?
根据我的理解,即使这被认为是无服务器计算,仍然有一个 VM / Azure 网站应用服务,其下有一个文件系统。
我可以使用 Kudu 控制台并四处导航并查看 /wwwroot 和 /home/functions/secrets 文件中的所有文件。
想象一个场景,其中编写了一个 azure 函数来写入具有唯一名称的文件而不执行清理,它最终会占用主机 VM 上的所有磁盘 space 并降低性能。这可能是开发人员意外发生的,并且可能会被忽视,直到为时已晚。
这让我想知道是不是故意不使用文件系统,还是我的函数写错了?
是的,您可以使用文件系统,但有一些限制,如 here 所述。该页面描述了一些您可以访问的目录,例如 D:\HOME 和 D:\LOCAL\TEMP。我已经修改了下面的代码以写入临时目录并且它有效:
var fs = require('fs');
module.exports = function (context, input) {
fs.writeFile('D:/local/Temp/message.txt', input, (err) => {
if (err) {
context.log(err);
throw err;
}
context.log('It\'s saved!');
context.done();
});
}
您的初始代码失败,因为它试图写入 D:\Windows\system32,这是不允许的。
我无法使使用节点文件系统模块的 azure 函数正常工作。
我创建了一个具有最基本 HTTP 触发功能的全新功能应用程序,并包含 'fs' 模块:
var fs = require('fs');
module.exports = function (context, req, res) {
context.log('function triggered');
context.log(req);
context.done();
}
这很好用。我在直播日志和函数调用列表中看到了完整的请求。
但是,一旦我添加实际使用文件系统的代码,它似乎崩溃 azure 函数。 它既不完成也不抛出错误。它似乎也没有出现在 azure 函数调用列表中,这很可怕,因为这是失败信息的丢失,我可能认为我的服务 运行 在实际发生崩溃时很好。
var fs = require('fs');
module.exports = function (context, req, res) {
context.log('function triggered');
context.log(req);
fs.writeFile('message.txt', 'Hello Node.js', (err) => {
if (err) throw err;
console.log('It\'s saved!');
context.done();
});
}
fs.writeFile
代码直接取自node.js网站:
https://nodejs.org/dist/latest-v4.x/docs/api/fs.html#fs_fs_writefile_file_data_options_callback
我在回调中添加了 context.done()
,但该代码片段在正常的开发环境中应该可以正常工作。
这提出了问题:
- 使用Azure Functions时是否可以使用文件系统?
- 如果可以,有什么限制?
- 如果没有限制,开发人员是否需要跟踪和执行 清理还是由一些沙箱处理?
根据我的理解,即使这被认为是无服务器计算,仍然有一个 VM / Azure 网站应用服务,其下有一个文件系统。 我可以使用 Kudu 控制台并四处导航并查看 /wwwroot 和 /home/functions/secrets 文件中的所有文件。
想象一个场景,其中编写了一个 azure 函数来写入具有唯一名称的文件而不执行清理,它最终会占用主机 VM 上的所有磁盘 space 并降低性能。这可能是开发人员意外发生的,并且可能会被忽视,直到为时已晚。
这让我想知道是不是故意不使用文件系统,还是我的函数写错了?
是的,您可以使用文件系统,但有一些限制,如 here 所述。该页面描述了一些您可以访问的目录,例如 D:\HOME 和 D:\LOCAL\TEMP。我已经修改了下面的代码以写入临时目录并且它有效:
var fs = require('fs');
module.exports = function (context, input) {
fs.writeFile('D:/local/Temp/message.txt', input, (err) => {
if (err) {
context.log(err);
throw err;
}
context.log('It\'s saved!');
context.done();
});
}
您的初始代码失败,因为它试图写入 D:\Windows\system32,这是不允许的。