这是我的nodejs代码:
const cp = require('child_process');
describe('cloud function test suites', () => {
describe('deleteCampaign test suites', () => {
const cloudFunctionName = 'deleteCampaign';
it('should print campaign data', () => {
const campaign = { id: '1' };
const encodedCampaign = Buffer.from(JSON.stringify(campaign)).toString(
'base64',
);
const data = JSON.stringify({ data: encodedCampaign });
const executeResultOutput = cp
.execSync(
`gcloud beta functions call ${cloudFunctionName} --data '${data}'`,
)
.toString();
const executionId = executeResultOutput.split(': ')[1];
const logs = cp
.execSync(
`gcloud beta functions logs read ${cloudFunctionName} --execution-id ${executionId}`,
)
.toString();
console.log(logs);
expect(logs).toContain('campaign: {"id":"1"}');
});
});
});
我想将日志打印到stdout,但是日志为空字符串。
但是当我使用gcloud
命令行读取日志时,就可以了。标准输出正确:
gcloud beta functions logs read deleteCampaign --execution-id ee5owvtzlekc
LEVEL NAME EXECUTION_ID TIME_UTC LOG
D deleteCampaign ee5owvtzlekc 2018-09-13 12:46:17.734 Function execution started
I deleteCampaign ee5owvtzlekc 2018-09-13 12:46:17.738 campaign: {"id":"1"}
D deleteCampaign ee5owvtzlekc 2018-09-13 12:46:17.742 Function execution took 9 ms, finished with status: 'ok'
我使用jest
和nodejs
为我的云功能编写一些测试。为什么日志是空字符串?
答案 0 :(得分:0)
您要获取的字符串为空,因为生成日志需要更多时间。即使Google Cloud Function已经完成执行,您也必须等待几秒钟才能准备好日志。
阅读代码,您不会让这种情况发生,因此您得到的是空字符串。
我注意到阅读您的代码的第一件事是这一部分:
const executionId = executeResultOutput.split(': ')[1];
我了解您要提取Google Cloud Function的执行ID。我在这里遇到了问题,因为该字符串不仅限于执行ID,还包括换行符和单词“ result”。我确保使用下面的代码提取必要的执行ID:
const executionId = executeResultOutput.split(':')[1]; //We get the GCP ID.
const executionId2 = executionId.split("\n")[0].toString(); //removing the right part of the string.
如果您找到了没有问题的获取执行ID的方法,请忽略我的代码。
在下面,您可以找到对我实现功能有用的代码。
let cloudFunctionLog ='';
function getLogs(){
console.log('Trying to get logs...');
const logs = cp
.execSync(`gcloud beta functions logs read ${cloudFunctionName} --execution-id ${executionId2}`);
return logs;
}
do{
cloudFunctionLog=getLogs();
if(!cloudFunctionLog){
console.log('Logs are not ready yet...');
}else{
console.log(`${cloudFunctionLog}`);
}
}while(!cloudFunctionLog);//Do it while the string comes empty.
当日志不再为空时,它们将显示在您的控制台中。