如何等待exec在路由器中完成?

时间:2019-03-28 17:04:59

标签: node.js

因此,我正在尝试从要使用exec执行的命令中返回标准输出。但是,由于exec是异步的,因此在响应发送undefined输出之前,我似乎无法返回标准输出。由于我正在使用router.post函数(甚至是名字),因此回调和async / await似乎对我没有帮助。

这是我用于执行的代码。

router.post("/select", (req, res, next) => {
  const imageLocation = "backend/images/" + req.body.imagePath;
  const execString = 'python backend/volatility/vol.py -f ' + imageLocation + ' imageinfo | grep "Suggested Profile(s) :"'
  let output;
  exec(execString, (err, stdout, stderr) => {
    if (err) {
      console.log(err);
    }
    output = stdout;
    console.log(stdout);
  });
    console.log(output);
    res.status(200).json({
      message: "test",
      output: output
    })
  console.log(req.body.imagePath);
})

我想发生的是在output设置之后发送exec的响应

我可能忽略了一些明显的事情,但是我只是没有看到它。我到处都看了,似乎找不到答案。

编辑:

对已经做出如此快速反应的人们表示抱歉。我正在尝试使响应速度更快,我认为那边可能做错了什么。

这是我的log.service.ts,具有相关功能:

  setImage(imagePath: any) {
    let response;
    this.http.post("http://localhost:3000/api/log/select", imagePath).subscribe((responseData) => {
      response = responseData;
      return response;
    });
  }

这是与html模板一起使用的组件:

  imageChosen(event: any) {
    console.log({imagePath: event.value});
    this.suggestedProfile = this.logService.setImage({imagePath: this.selectedImage});
    console.log(this.suggestedProfile);

  }

也许与subscribe()部分有关? 对不起,造成混乱!

2 个答案:

答案 0 :(得分:2)

您可以尝试像这样更改代码

router.post("/select", (req, res, next) => {
  const imageLocation = "backend/images/" + req.body.imagePath;
  const execString = 'python backend/volatility/vol.py -f ' + imageLocation + ' imageinfo | grep "Suggested Profile(s) :"'
  let output;
  exec(execString, (err, stdout, stderr) => {
    if (err) {
      console.log(err);
    } else {
      output = stdout;
      console.log(stdout);
      res.status(200).json({
        message: "test",
        output: output
      })
      console.log(req.body.imagePath);
    }
  });
})

答案 1 :(得分:0)

在这种情况下:

setImage(imagePath: any) : Observable<string> {
    return(this.http.post("http://localhost:3000/api/log/select", imagePath));
  }

imageChosen(event: any) {
    console.log({imagePath: event.value});
    this.logService.setImage({imagePath: this.selectedImage}).subscribe((response) => {
        this.suggestedProfile = response;
        console.log(this.suggestedProfile);
    });
  }
  1. 不返回价值而是可观察的
  2. 订阅并在其中使用值