最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

尝试返回字符串Nodejs VM时引用错误

IT培训 admin 4浏览 0评论

尝试返回字符串Nodejs VM时引用错误

我正在使用名为safe-eval的npm模块来评估我发送到后端的一些JavaScript代码。代码通常是一个函数,它将使用我将提供的参数在safe-eval中执行。问题是当返回某个值时,在这种情况下是一个字符串,它没有这样做,而是它给出了一个Reference错误并将字符串值解释为变量。

router.post('/test/:nombre', function(req, res, next){  
    let nombEjer = req.params.nombre;
    let code = "";
    let error = {etype : ""}

    try{
        //Evalua el codigo de manera segura
        code = safeEval(req.body.code, {},{timeout: 5, displayErrors : true});
    }catch(e){
        error.linea = e.stack.split('evalmachine.<anonymous>:')[1].substring(1, 2);
        error.etype = e.toString();

        //Devulve error en caso de que mala sintaxis
        return res.status(400).send(error); 
    }

    //Si es una funcion, trae los valores y soluciones de la base de datos
    if(typeof code === "function"){ 
        let resultados = [];

        Ejercicios.findOne({titulo: nombEjer}, 'parametros', (err, doc)=>{
            if(err) return res.status(500).send({error : "No se ha podido encontrar el ejercicio"});

            //Ejecutar el codigo con cada lista de parametros y almacenar los resultados
            doc.parametros.forEach(function(elem, indx) {
                try{
                    resultados[indx] = safeEval(code(...elem));
                }catch(e){
                    error.etype = e.toString();
                }
            });

            if(error.etype != "") return res.status(400).send(error);
            return res.status(200).send({results : resultados});
        });
    }else{
        return res.status(400).send({etype: "El codigo es invalido"});
    }
});

问题发生在forEach的一次迭代中。

是的,我知道forEach不应该用作循环的控制语句,但在这种情况下我这样做是为了捕获在执行过程中可能出现的任何错误,我正在经过的参数列表。

也就是说,当我使用此函数传递参数列表时出现问题(此函数应该返回字符串n次):

//Function I'm passing
function cadenaVeces(str, n) {
  return str.repeat(n);
}

//Parameter I'm passing
doc.parametros = [ [ "Ho", 2 ], [ "Ho", 3 ], [ "Ho", 1 ], [ "Ho", 0 ], [ "Ho", 5 ], [ "Vaya chico!", 2 ], [ "x", 4 ], [ "", 4 ], [ "codigo", 2 ], [ "codigo", 3 ] ]

这是我得到的回应。

{“etype”:“ReferenceError:未定义codigocodigocodigo”}

回答如下:

这种行为似乎有效:safeEval获取代码字符串,对其进行求值并返回一些值:primitive或object(包括函数)。当你调用safeEval(req.body.code)时,它返回函数code()。当你打电话给safeEval(code(...elem));,例如safeEval(code(...[ "codigo", 3 ]));时会发生这种情况:

  1. code(...[ "codigo", 3 ])返回'codigocodigocodigo';
  2. safeEval('codigocodigocodigo')尝试将codigocodigocodigo作为代码进行评估,而不是作为字符串,并且因为未声明codigocodigocodigo而发生引用错误。

如果你只需要一个字符串,你可以简单地调用code(...elem)。如果您需要将函数的结果作为字符串进行求值(尽管看起来很混乱),请调用safeEval(`'${code(...elem)}'`);将结果括在引号中。

尝试返回字符串Nodejs VM时引用错误

我正在使用名为safe-eval的npm模块来评估我发送到后端的一些JavaScript代码。代码通常是一个函数,它将使用我将提供的参数在safe-eval中执行。问题是当返回某个值时,在这种情况下是一个字符串,它没有这样做,而是它给出了一个Reference错误并将字符串值解释为变量。

router.post('/test/:nombre', function(req, res, next){  
    let nombEjer = req.params.nombre;
    let code = "";
    let error = {etype : ""}

    try{
        //Evalua el codigo de manera segura
        code = safeEval(req.body.code, {},{timeout: 5, displayErrors : true});
    }catch(e){
        error.linea = e.stack.split('evalmachine.<anonymous>:')[1].substring(1, 2);
        error.etype = e.toString();

        //Devulve error en caso de que mala sintaxis
        return res.status(400).send(error); 
    }

    //Si es una funcion, trae los valores y soluciones de la base de datos
    if(typeof code === "function"){ 
        let resultados = [];

        Ejercicios.findOne({titulo: nombEjer}, 'parametros', (err, doc)=>{
            if(err) return res.status(500).send({error : "No se ha podido encontrar el ejercicio"});

            //Ejecutar el codigo con cada lista de parametros y almacenar los resultados
            doc.parametros.forEach(function(elem, indx) {
                try{
                    resultados[indx] = safeEval(code(...elem));
                }catch(e){
                    error.etype = e.toString();
                }
            });

            if(error.etype != "") return res.status(400).send(error);
            return res.status(200).send({results : resultados});
        });
    }else{
        return res.status(400).send({etype: "El codigo es invalido"});
    }
});

问题发生在forEach的一次迭代中。

是的,我知道forEach不应该用作循环的控制语句,但在这种情况下我这样做是为了捕获在执行过程中可能出现的任何错误,我正在经过的参数列表。

也就是说,当我使用此函数传递参数列表时出现问题(此函数应该返回字符串n次):

//Function I'm passing
function cadenaVeces(str, n) {
  return str.repeat(n);
}

//Parameter I'm passing
doc.parametros = [ [ "Ho", 2 ], [ "Ho", 3 ], [ "Ho", 1 ], [ "Ho", 0 ], [ "Ho", 5 ], [ "Vaya chico!", 2 ], [ "x", 4 ], [ "", 4 ], [ "codigo", 2 ], [ "codigo", 3 ] ]

这是我得到的回应。

{“etype”:“ReferenceError:未定义codigocodigocodigo”}

回答如下:

这种行为似乎有效:safeEval获取代码字符串,对其进行求值并返回一些值:primitive或object(包括函数)。当你调用safeEval(req.body.code)时,它返回函数code()。当你打电话给safeEval(code(...elem));,例如safeEval(code(...[ "codigo", 3 ]));时会发生这种情况:

  1. code(...[ "codigo", 3 ])返回'codigocodigocodigo';
  2. safeEval('codigocodigocodigo')尝试将codigocodigocodigo作为代码进行评估,而不是作为字符串,并且因为未声明codigocodigocodigo而发生引用错误。

如果你只需要一个字符串,你可以简单地调用code(...elem)。如果您需要将函数的结果作为字符串进行求值(尽管看起来很混乱),请调用safeEval(`'${code(...elem)}'`);将结果括在引号中。

发布评论

评论列表 (0)

  1. 暂无评论