在node.js中执行String中的函数

时间:2013-02-12 09:55:44

标签: javascript node.js mongodb parameters

有没有办法从作为请求参数传递的String执行函数并在node.js中返回结果? 想象一下包含String的请求:

"db.users.find()"

作为参数

如果我知道我想执行这个陈述,我会这样做:

db.collection('users', function(err, collection) {
    collection.find().toArray(function(err, items) {
        res.send(items);
    });
});

我想要的是像解析器一样执行给定语句并返回结果。

我试过这样:

exports.execStatement = function(req, res) {
//var statemnet = req.params.statement;
  var statement = "collection.find().toArray(function(err, items) {
        res.send(items);});";
  db.collection('users', function(err, collection) {        
    eval(statement)
   });
};

这段代码给了我错误:

var statement = "collection.find().toArray(function(err, prdel) { ...
SyntaxError: Unexpected token ILLEGAL

有什么问题?为什么我不能执行存储在String中的代码?在此工作之后,我想弄清楚如何执行在请求中作为参数传递的代码。

这种方法甚至可能吗?

1 个答案:

答案 0 :(得分:0)

第二个示例显示了如何向db添加函数。

http://mongodb.github.com/node-mongodb-native/api-generated/db.html#eval

但不要。

有三个主要原因
  1. 2.2及更早版本SpiderMonkey是单线程的,意味着“存储过程”的性能极差
  2. eval在操作期间需要写入锁定(除非您专门设置nolock,然后最好不要写入,否则它将失败)。这将停止db上的所有写操作,直到您的函数完成执行。
  3. 注射攻击,但上面已经介绍过。