как сделать что-то перед запросом HTTP POST в node.js?

1

Я очень новичок в nodejs, что я пытаюсь сделать, это загрузить изображение с некоторыми данными в API nodejs, но прежде чем сохранять данные в 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
      }
    });
  });

если код python занимает так много времени, мой объект будет пустым?


любой ответ будет высоко оценен


  • 0
    Ваш код Mongo должен ждать до завершения кода Python? Это ваше требование. Если это так, попробуйте «обратные вызовы», «обещания» или «асинхронные функции»
  • 0
    спасибо, @wahid_abdul да, именно то, что я хочу сделать, как я могу использовать «обратные вызовы», «обещания» или «асинхронные функции»?
Теги:
express

1 ответ

1
Лучший ответ

Вы пытались использовать 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/await Async/ aync/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
      }
    });
  });
  • 0
    работает отлично
  • 0
    рад помочь :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню