我的问题是:当我使用像xml2json这样的npm包时,如何在Firebase的Cloud函数上为shell脚本提供节点?
上下文:
我正在将一个软件从短生活的Docker容器转移到Firebase的Cloud功能。该软件处理大型XML文件并将部件转换为JSON。
由于内存消耗,我通过shell使用xmllint和xml2json。
"@niekoost/convertini": "file:niekoost-convertini-1.0.1.tgz"
Xmllint按预期工作(在我添加到函数目录中的package.json的npm包中分发)
#!/usr/bin/env node
但是通过xml2json的管道会产生问题: xml2json的第一行引起了我的问题
Error: Command failed: ./xmllint --xpath "//OrderData"
/tmp/kdjf6kv9hku86xw4h392j4i.xml | /user_code/node_modules/xml2json/bin/xml2json
/usr/bin/env: node: No such file or directory
这会导致Firebase控制台中的云功能日志出错
Qt::ItemFlags ImportGroupListModel::flags(const QModelIndex & index) const
{
Qt::ItemFlags flags = Qt::NoItemFlags;
if (index.isValid()) {
ImportGroupModelItem* item = static_cast<ImportGroupModelItem*>(index.internalPointer());
if (item != nullptr) {
if (ITEM IS ROOT ELEMENT) {
flags = flags | Qt::ItemFlag::ItemIsDropEnabled | Qt::ItemFlag::ItemIsEnabled;
}
if (ITEM IS TOP GROUP)
flags = flags | Qt::ItemIsDragEnabled;
if (ITEM IS TOP OR NESTED GROUP) {
flags = flags | Qt::ItemFlag::ItemIsDropEnabled | Qt::ItemFlag::ItemIsEnabled | Qt::ItemFlag::ItemIsSelectable;
}
if(ITEM IS ENTRY) {
flags = flags | Qt::ItemFlag::ItemIsEnabled | Qt::ItemFlag::ItemIsSelectable;
}
}
}
return flags;
}
节点位于Firebase的云端功能上?我可以将它提供给/ usr / bin / env吗?或者我应该分叉xml2json npm包并更改该代码。
答案 0 :(得分:2)
经过一些额外的搜索后,我找到了适合我情况的解决方案,无需更改为xml2json提供的npm包。
由于xml2json用于'exec'正在执行的命令中,我们只需要在该exec的环境中提供Node二进制的路径。此路径可以从'process.execPath'派生:
var exec = require('child_process').exec;
var process = require('process');
// get path where the node binary is located from within the code that
// is being executed by the node runtime provided by Firebase
var nodePath = process.execPath;
nodePath = nodePath.split('/');
nodePath = nodePath.splice(0, nodePath.length-1).join('/');
// add path to the environment
process.env.PATH += ':' + nodePath;
var cmd = './xmllint --xpath "//OrderData" /xyz.xml | /user_code/node_modules/xml2json/bin/xml2json';
// call the command and provide the extended env
exec(cmd, {env: process.env}, function(error, stdout, stderr) {
...
});