Node.js child_进程在Nodejs中的行为如何
我有一个工作的Nodejs代码,但是,child_进程库的行为很奇怪,我只是想知道这个库是如何工作的 我的代码尝试从S3下载SSL证书,然后使用child_进程库基于现有文件创建两个新文件Node.js child_进程在Nodejs中的行为如何,node.js,child-process,Node.js,Child Process,我有一个工作的Nodejs代码,但是,child_进程库的行为很奇怪,我只是想知道这个库是如何工作的 我的代码尝试从S3下载SSL证书,然后使用child_进程库基于现有文件创建两个新文件 const AWS = require('aws-sdk'); const fs = require('fs'); const child_process = require("child_process"); const exec = require('child_process').exec; var
const AWS = require('aws-sdk');
const fs = require('fs');
const child_process = require("child_process");
const exec = require('child_process').exec;
var s3 = new AWS.S3();
var filePath = '../Desktop/Certs/'
var bucketName = 'neb.certificates' //replace example bucket with your s3 bucket name
var params = {
Bucket: bucketName,
Prefix: 'dev/jenkins.secure.care/',
};
s3.listObjectsV2(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else {
// console.log(data.Contents)
var len = data.Contents.length
for(var i=0; i<len; i++){
var key = data.Contents[i]["Key"]
var newPath = filePath.concat(key.substring(31))
const downloadFile = (newPath, bucketName, key) => {
//construct getParam
var getParams = {
Bucket: bucketName,
Key: key
};
s3.getObject(getParams, (err, data) => {
if (err) console.error(err)
fs.writeFileSync(newPath, data.Body.toString())
// console.log(`${newPath} has been created!`)
})
}
downloadFile(newPath, bucketName, key)
}
}
});
exec('mv ../Desktop/Certs/cert.pem ../Desktop/Certs/jenkins.crt', (err, stdout, stderr) => {
if (err) {
console.error(err);
return;
}
console.log(stdout);
});
exec('mv ../Desktop/Certs/privkey.pem ../Desktop/Certs/jenkins.key', (err, stdout, stderr) => {
if (err) {
console.error(err);
return;
}
console.log(stdout);
});
请帮助这里的问题似乎是代码的异步执行。在本例中,发生了以下情况:
s3.listObjectsV2()
,完成后,启动回调(但不是现在,将来)exec()
,完成后,启动回调(但不是现在,将来)exec()
中的这两个回调可能是在s3
的回调之前触发的,这就是它不起作用的原因
这里的解决方案是确保那些exec()
s在s3.listObjects
之后被激发。所以您有两种选择:首先是对s3
做出承诺,如下:s3.listObjectsV2(params.promise()
和等待它,然后在中。然后((数据)=>{})
您有数据,在中。catch((错误)=>{}
您有错误。或者您可以简单地将这些exec()
s放在s3
调用的回调中
根据解决方案2,您的代码应该是这样的(从注释中):
const AWS=require('AWS-sdk');
常数fs=要求('fs');
const child_process=require(“child_process”);
const exec=require('child_process')。exec;
var s3=新的AWS.s3();
var filePath='../Desktop/Certs/'
var bucketName='neb.certificates'//将示例bucket替换为s3 bucket名称
变量参数={
Bucket:bucketName,
前缀:“dev/jenkins.secure.care/”,
};
s3.listObjectsV2(参数,异步函数(错误,数据){
if(err)console.log(err,err.stack);//发生错误
否则{
//console.log(data.Contents)
var len=data.Contents.length
对于(var i=0;i{
//构造getParam
var getParams={
Bucket:bucketName,
钥匙:钥匙
};
返回s3.getObject(getParams.promise();
};
const downloadData=等待下载文件(newPath、bucketName、key).catch(console.error);
writeFileSync(newPath,downloadData.Body.toString());
log(newPath,'created');
}
//重命名文件
log('renaming first cert.pem');
exec('mv../Desktop/Certs/cert.pem../Desktop/Certs/jenkins.crt',(err,stdout,stderr)=>{
如果(错误){
控制台错误(err);
返回;
}
控制台日志(stdout);
});
log('renaming second privkey.pem');
exec('mv../Desktop/Certs/privkey.pem../Desktop/Certs/jenkins.key',(err,stdout,stderr)=>{
如果(错误){
控制台错误(err);
返回;
}
控制台日志(stdout);
});
}
});
谢谢你的解决方案,我对NodeJ非常陌生,我想我更喜欢把那些exec()
放在回调函数中,问题是我需要把回调函数放在哪里。在这一行下载文件(newPath,bucketName,key)
是个好主意吗?您需要将那些exec
放在这一行下:fs.writeFileSync(newPath,data.Body.toString())
,因为这是从s3下载文件并能够对其进行操作的地方(如重命名e.x)。我仍然很难在代码中实现回调:(我在函数中添加了回调
作为可选参数,如下所示const downloadFile=(newPath,bucketName,key,callback)
我不知道如何在callI中放置两个回调我刚刚尝试了更新的解决方案,在我的情况下仍然不起作用:(
child_process.execSync("sleep 5");
const AWS = require('aws-sdk');
const fs = require('fs');
const child_process = require("child_process");
const exec = require('child_process').exec;
var s3 = new AWS.S3();
var filePath = '../Desktop/Certs/'
var bucketName = 'neb.certificates' //replace example bucket with your s3 bucket name
var params = {
Bucket: bucketName,
Prefix: 'dev/jenkins.secure.care/',
};
s3.listObjectsV2(params, async function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else {
// console.log(data.Contents)
var len = data.Contents.length
for(var i=0; i<len; i++){
var key = data.Contents[i]["Key"]
var newPath = filePath.concat(key.substring(31))
const downloadFile = (newPath, bucketName, key) => {
//construct getParam
var getParams = {
Bucket: bucketName,
Key: key
};
return s3.getObject(getParams).promise();
};
const downloadData = await downloadFile(newPath, bucketName, key).catch(console.error);
fs.writeFileSync(newPath, downloadData.Body.toString());
console.log(newPath, 'created');
}
//rename files
console.log('renaming first cert.pem');
exec('mv ../Desktop/Certs/cert.pem ../Desktop/Certs/jenkins.crt', (err, stdout, stderr) => {
if (err) {
console.error(err);
return;
}
console.log(stdout);
});
console.log('renaming second privkey.pem');
exec('mv ../Desktop/Certs/privkey.pem ../Desktop/Certs/jenkins.key', (err, stdout, stderr) => {
if (err) {
console.error(err);
return;
}
console.log(stdout);
});
}
});