如何在HTTP POST请求之前在node.js?

2024-09-27 21:30:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我对nodejs很陌生,我试着上传一个带有一些数据的图片到nodejs API,但是在将数据保存到Mongo DB之前,我试着用Python类对上传的图片做一些处理,然后将结果保存到DB

所以我可以将上传的图像发送到python代码中,并在将任何数据保存到DB之前等待结果吗

我的密码在这里

  router.post('/img2text', upload.single('photo'), (req, res) => {
    // Create the object for insertion into database
    const Img2text = new img2text({
      imgPath: req.file.path,
      sender: req.body.sender,
      processed: 0,
      resultText: "no result",
    });
/////////////////////////////////////////////////////////////start
    var exec = require("child_process").exec;
    exec(`python uploads/hello.py ${req.file.path}`,(error, stdout, stderr) => {
      if (error) {
        Img2text.processed=0;
        Img2text.resultText='no result'
        console.error(`exec error: ${error}`);
        return;
      }
      console.log(`stdout: ${stdout}`);
      Img2text.processed=1;
      Img2text.resultText=stdout.toString('utf8');
      console.log(`stderr: ${stderr}`);
      console.log(req.query.firstname);
    });
    /////////////////////////////////////////////////////////end

    // Save  into database
    Img2text.save((err) => {
      // Check if error
      if (err) {
        res.json({ success: false, message: err });
      } else {
        console.log("img saved !!")
        res.json({ success: true, message:img.resultText }); // Return success message
      }
    });
  });

if the python code takes so long time my object will be empty?


任何回答都将不胜感激



Tags: 数据logdbifstderrstdoutreserror
1条回答
网友
1楼 · 发布于 2024-09-27 21:30:48

您是否尝试过使用Promise,如果没有,请参阅此链接Promise MDN。只需将您的流程包装在Promise中,当您完成流程时,解析它并将其保存到数据库中。你知道吗

router.post('/img2text', upload.single('photo'), (req, res) => {
        // Receive your image

        let pythonProcess = new Promise((resolve, reject)=>{
         // do your process
         reolve() // resolve with updated data
        })
        pythonProcess.then(img =>{
         //save to db
        })
   })

在您的情况下,我更喜欢使用aync/awaitAsync/await MDN。不要把它当作另一种方式来做,它只是使用promise的现代方式。作为内部await也设置了promise链。你有两个选择,要么你可以通过promises你会很方便地找到javascript最好的东西之一,或者如果你想要一小段代码,就用await。你知道吗

router.post('/img2text', upload.single('photo'), async(req, res) => { // To use await function need to be a async function
    // Create the object for insertion into database
    const Img2text = new img2text({
      imgPath: req.file.path,
      sender: req.body.sender,
      processed: 0,
      resultText: "no result",
    });
/////////////////////////////////////////////////////////////start
    var exec = require("child_process").exec;
    await exec(`python uploads/hello.py ${req.file.path}`,(error, stdout, stderr) => {
      if (error) {
        Img2text.processed=0;
        Img2text.resultText='no result'
        console.error(`exec error: ${error}`);
        return;
      }
      console.log(`stdout: ${stdout}`);
      Img2text.processed=1;
      Img2text.resultText=stdout.toString('utf8');
      console.log(`stderr: ${stderr}`);
      console.log(req.query.firstname);
    });
    /////////////////////////////////////////////////////////end

    // Save  into database
    Img2text.save((err) => {
      // Check if error
      if (err) {
        res.json({ success: false, message: err });
      } else {
        console.log("img saved !!")
        res.json({ success: true, message:img.resultText }); // Return success message
      }
    });
  });

相关问题 更多 >

    热门问题