Как отправить next () в функцию обратного вызова - PullRequest
0 голосов
/ 27 февраля 2019

Здесь я хочу отправить next (), когда мои данные получены из скрипта python, но я получаю сообщение об ошибке [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту.

const {PythonShell} = require('python-shell');

module.exports = (req, res, next)=>{
let myPythonScriptPath = 'encrypt.py';
const pyshell = new PythonShell(myPythonScriptPath);
let path = req.file.path;    
pyshell.send(path);


pyshell.on("message", function(data){
    console.log(data);
    req.filepath = data;
    next();
})

// end the input stream and allow the process to exit
pyshell.end(function (err) {
    if (err){
        throw err;
    }
});
}

но он работает, когда я ставлю next () в конец кода, но тогда мой req.filepath не определен

const {PythonShell} = require('python-shell');

module.exports = (req, res, next)=>{
let myPythonScriptPath = 'encrypt.py';
const pyshell = new PythonShell(myPythonScriptPath);
let path = req.file.path;    
pyshell.send(path);


pyshell.on("message", function(data){
    console.log(data);
    req.filepath = data;
})

// end the input stream and allow the process to exit
pyshell.end(function (err) {
    if (err){
        throw err;
    }
});

next();
}

Что я хочу, это хранить данные, поступающие из скрипта python, в req.filepath, который должен быть отправлен следующему промежуточному программному обеспечению.Кто-нибудь может мне помочь с этим?

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Используя методологию обратного вызова, этого можно добиться, отправив результат функции в callback (). (Здесь следующий обратный вызов)

Код приведен ниже:

const {PythonShell} = require('python-shell');

module.exports = function (req, res, next){
try{
    let myPythonScriptPath = '/home/anmolmiddha/Projects/coreshare/server/api/python/encrypt.py';
    const pyshell = new PythonShell(myPythonScriptPath);
    let path = req.file.path;
    pyshell.send(path);
    pyshell.on("message", function(data){
    });

    pyshell.end(function (err, rslt) {
        if(err){
            res.status(500).json(err);
        }
        else{
            req.filepath = JSON.stringify(path).split('"')[1];
            next(rslt);
        }
    });
}
catch(error) {
    return res.status(401).json({
        message: "Invalid token Auth failed"
    })
}
}
0 голосов
/ 27 февраля 2019

Вы видите это поведение из-за порядка асинхронных задач, который я перечислил ниже в комментариях.Выполнение не обязательно происходит в той же последовательности, в которой написан код, поэтому вы либо пытаетесь изменить запрос / ответ после команды PyShell, уже отправленной (случай №1 выше), или Express уже перешел к следующему промежуточному программному обеспечению до того, как было установлено req.filepath (случай № 2 выше).

const {PythonShell} = require('python-shell');

module.exports = (req, res, next) => {
  let myPythonScriptPath = 'encrypt.py';
  const pyshell = new PythonShell(myPythonScriptPath);
  let path = req.file.path;
  pyshell.send(path); // 1) Send the command

  // 3) This anonymous function is invoked, but it's
  // too late -- the command has already been sent
  // and has continued on to the next middleware.
  pyshell.on("message", function(data){
    console.log(data);
    // This will be undefined in the next middleware
    // because it moved on before it was actually set.
    req.filepath = data;
  })

  // 4) This anonymous function gets run last.
  pyshell.end(function (err) {
    if (err){
        throw err;
    }
  });

  next() // 2) Tell Express to continue on to the next middleware.
}

Есть ли у вас другое промежуточное программное обеспечение до или после этого, которое пытается изменить илиотправить HTTP-ответ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...