尝试 return 字符串 Nodejs VM 时出现引用错误
Reference error when trying to return a string Nodejs VM
我正在使用一个名为 safe-eval 的 npm 模块来评估我发送到后端的一些 JavaScript 代码。该代码通常是一个函数,它将使用我将提供的参数在安全评估内部执行。问题是当 returning 某个值时,在本例中是一个字符串,它并没有这样做,而是给我一个引用错误并将字符串值解释为一个变量。
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 不应该用作循环的控制语句,但在这种情况下,我这样做是为了捕获在执行过程中可能出现的任何错误,其中包含我的参数列表我路过
就是说,当我用这个函数传递参数列表时出现了问题(这个函数应该 return 字符串 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 is not defined" }
这种行为似乎是有效的:safeEval
接受一个代码字符串,对其求值,returns 一些值:原始值或对象(包括函数)。当您调用 safeEval(req.body.code)
时,它 returns 函数 code()
。当您调用 safeEval(code(...elem));
时,例如 safeEval(code(...[ "codigo", 3 ]));
会发生以下情况:
code(...[ "codigo", 3 ])
returns 'codigocodigocodigo'
;
safeEval('codigocodigocodigo')
尝试将 codigocodigocodigo
评估为代码,而不是字符串,并且发生引用错误,因为未声明 [=18=]。
如果你只需要一个字符串,你可以简单地调用code(...elem)
。如果您需要将函数的结果计算为字符串(虽然这看起来很混乱),请调用 safeEval(`'${code(...elem)}'`);
将结果括在引号中。
我正在使用一个名为 safe-eval 的 npm 模块来评估我发送到后端的一些 JavaScript 代码。该代码通常是一个函数,它将使用我将提供的参数在安全评估内部执行。问题是当 returning 某个值时,在本例中是一个字符串,它并没有这样做,而是给我一个引用错误并将字符串值解释为一个变量。
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 不应该用作循环的控制语句,但在这种情况下,我这样做是为了捕获在执行过程中可能出现的任何错误,其中包含我的参数列表我路过
就是说,当我用这个函数传递参数列表时出现了问题(这个函数应该 return 字符串 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 is not defined" }
这种行为似乎是有效的:safeEval
接受一个代码字符串,对其求值,returns 一些值:原始值或对象(包括函数)。当您调用 safeEval(req.body.code)
时,它 returns 函数 code()
。当您调用 safeEval(code(...elem));
时,例如 safeEval(code(...[ "codigo", 3 ]));
会发生以下情况:
code(...[ "codigo", 3 ])
returns'codigocodigocodigo'
;safeEval('codigocodigocodigo')
尝试将codigocodigocodigo
评估为代码,而不是字符串,并且发生引用错误,因为未声明 [=18=]。
如果你只需要一个字符串,你可以简单地调用code(...elem)
。如果您需要将函数的结果计算为字符串(虽然这看起来很混乱),请调用 safeEval(`'${code(...elem)}'`);
将结果括在引号中。