未找到Firebase / usr / bin / env:节点的云功能

时间:2017-09-08 11:08:12

标签: firebase google-cloud-functions

我的问题是:当我使用像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包并更改该代码。

1 个答案:

答案 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) {
  ...
});