Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js child_进程在Nodejs中的行为如何_Node.js_Child Process - Fatal编程技术网

Node.js child_进程在Nodejs中的行为如何

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

我有一个工作的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 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()
    ,完成后,启动回调(但不是现在,将来)
  • 这三个步骤立即一个接一个地启动。它们都有自己的回调函数,将来会触发。好吧,但未来是什么时候确切地你不知道。在您的情况下,
    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);  
          });
      }
    });