通过node.js在当前shell会话中设置GOOGLE_应用程序_凭据
概述: 我正在通过Node.js v8.12.0将我的产品部署自动化到GCP,然后是GCS。此部署过程的开始需要我执行以下操作:通过node.js在当前shell会话中设置GOOGLE_应用程序_凭据,node.js,google-cloud-platform,google-cloud-storage,Node.js,Google Cloud Platform,Google Cloud Storage,概述: 我正在通过Node.js v8.12.0将我的产品部署自动化到GCP,然后是GCS。此部署过程的开始需要我执行以下操作: 遍历项目文件夹中的文件夹和文件以查找GCS服务帐户JSON密钥文件 识别所述密钥文件的位置 运行export GOOGLE_APPLICATION_CREDENTIALS=“/path/to/file/[file_NAME].json”设置位置,以便我可以执行代码通过节点调用GCS函数 我尝试通过node.js中的child_process.exec模块执行命令。执行
const{Storage}=require('@googlecloud/Storage');
常量存储=新存储();
var readFileTree=require('read-file-tree');
const prompts=require('prompts');
const find=require('find-file-up');
//var tty=需要('tty');
var程序=要求(“指挥官”);
const{exec}=require('child_process');
常量粉笔=需要(“粉笔”);
var gsbucket={};
var i=0;
函数findOauthJSON(){
log(“查找您的服务帐户密钥…”)
查找('fauxfile_1123456ae.json','a/b/c',函数(err,file){
如果(文件!==未定义){
log(“找到的服务密钥:”,文件);
setOathJSON(文件);
}else if(err!==未定义){
控制台日志(err);
}否则{
log(“找不到服务帐户密钥。请添加到文件夹中,然后重试。”)
}
});
}
函数setOathJSON(文件){
日志(“设置服务密钥以访问地面军事系统…”);
var命令='export GOOGLE\u APPLICATION\u CREDENTIALS=\“'+file+'\”;
exec(命令,(err、stdout、stderr)=>{
if(err==null){
log(“服务密钥集!”);
}
//*整个*标准输出和标准输出(缓冲)
log(`stdout:${stdout}`);
log(`stderr:${stderr}`);
log(`err:${err}`);
console.log(“cmd:+命令”);
});
}
函数gstoreInfo(){
log(“获取云存储信息…”);
存储
.getbucket()
。然后(结果=>{
常数桶=结果[0];
bucket.forEach(bucket=>{
gsbucket[“gstoreb”+i]=bucket.name;
console.log(“找到的bucket:+bucket.name”);
i++;
});
})
.catch(错误=>{
console.error('error:',err);
});
}
找到了答案。节点惯用库允许您通过实例化的存储对象设置keyFileName路径,如下所示:
const存储=新存储({
projectId:'mystorage-bucket-123456',
keyFilename:''/path/to/keyfile.json''
});代码>“因此我可以执行代码通过节点调用GCS函数”您试图从这些节点云函数调用什么GCS函数?@jimmartens列出存储桶、上载对象、设置ACL(访问控制列表)。它是跨GCP项目进行通信还是所有内容都在一个项目中?您是否考虑过使用constructor options对象并为您使用的每个API传入keyFilename
?这样,您就根本不需要GOOGLE\u应用程序\u凭据了。如果它都在同一个项目中,那么如果您使用惯用库,您甚至不需要凭据。我在别的地方回答了这样的问题: