Javascript 更好更快的评估方法?

Javascript 更好更快的评估方法?,javascript,performance,node.js,Javascript,Performance,Node.js,我希望动态生成查询并使用以下代码段: --snip-- module.exports = { get : function(req, res, next) { var queryStr = "req.database.table('locations').get(parseInt(req.params.id))"; if (req.params.id) { if (req.fields) { queryStr += '.pick(' + req.fieldsStr

我希望动态生成查询并使用以下代码段:

--snip--
module.exports = {

get : function(req, res, next) {
  var queryStr = "req.database.table('locations').get(parseInt(req.params.id))";

  if (req.params.id) {
    if (req.fields) {
      queryStr += '.pick(' + req.fieldsStr + ')';
    }

    console.log(queryStr);
    eval(queryStr).run(function(result) { 
      console.log(result);
      res.send(result);
    });
  } else if (!req.params.id) {
--snip--
然而,引入eval打开了我的代码注入(req.fields充满了url参数),我看到我的应用程序的响应时间从7毫秒增加到11毫秒

有没有更聪明的方法来完成我在这里所做的事情


请给出建议。

如果我理解正确,您应该使用以下内容:

--snip--
module.exports = {

get : function(req, res, next) {

  var queryResult = req.database.table('locations').get(parseInt(req.params.id));

  if (req.params.id) {
    if (req.fields) {
      queryResult = queryResult.pick.apply(queryResult, getFields(req.fieldsStr));
    }

    queryResult.run(function(result) { 
      console.log(result);
      res.send(result);
    });
  } else if (!req.params.id) {
--snip--
其中
getFields
类似于:

var fields = {
        'name': name,
        'address': address,
        'zipcode': zipcode
        // ...
    };

function getFields(str) {
    return str.split(',').map(function(u) {
        return fields[u];
    });
}
当然,如果
req.fields
本身就是一个字符串数组,那么您可以使用它来代替拆分
req.fieldsStr

与每次(或大多数)注入一样,最好的解决方案是预先定义可能的字段列表。例如:

var predefined_fields = [ "id", "name", "age" ];

if (predefined_fields.indexOf( req.fieldsStr ) !== 0) {
    // do something
}
此外,您还可以在
queryStr
之外推送以下内容:
parseInt(req.params.id)

var id = parseInt(req.params.id);
var queryStr = "req.database.table('locations').get("+id+")";
解决了二次注射问题

当然,将来它可能会变得有点复杂,所以我建议编写(或使用)某种查询生成器

我不知道您正在使用的库,但是看起来,您可以简单地执行查询,而无需字符串连接和求值。在所有这些之后,
.run
方法代表了一些东西,对吗?这将明显提高性能和安全性

编辑您似乎根本不需要这些字符串。这应该起作用:

var query = req.database.table('locations').get(parseInt(req.params.id));
if (req.params.id) {
    if (req.fields) {
      query = query.pick( req.fieldsStr );
    }

    console.log(queryStr);
    query.run(function(result) { 
       console.log(result);
       res.send(result);
    });
}

安全高效。:)

看起来这一切都归结为需要
eval
req.fieldsStr
,可能还有另一种方法。
req.fieldsStr
可以是什么值?fieldsStr是从数组生成的,它包含字符串对象,例如“name”、“address”、“zipcode”,我假设您有名为
name
address
zipcode
等变量。该库来自数据库,我尽量避免对数据建模,以充分利用无模式性database@user1707250是的,那很好。你不需要这些字符串。查看我的更新。