javascript - 更好更快的评估方法?

标签 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 + ')';
    }

    console.log(queryStr);
    eval(queryStr).run(function(result) { 
      console.log(result);
      res.send(result);
    });
  } else if (!req.params.id) {
--snip--

然而,引入 eval 会打开我的代码以进行注入(inject)(req.fields 中填充了 url 参数),并且我看到应用程序的响应时间从 7 毫秒增加到 11 毫秒

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

请指教。

最佳答案

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

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+")";

这解决了第二次注入(inject)问题。

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

我不知道您正在使用的库,但看起来您可以简单地进行查询,而无需字符串连接和评估。毕竟这个 .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);
    });
}

安全高效。 :)

关于javascript - 更好更快的评估方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13556136/

相关文章:

javascript - 在 node.js 中验证一个集合是否为空

javascript -/bin/sh 未找到 -- spawnSync

javascript - X 单击后如何禁用按钮?

javascript - Uncaught TypeError : selectedText. split is not a function,我的代码有什么问题

javascript getImageData 未从 png 图像返回正确的像素颜色

c++ - __try/__except block 或 try/catch block 哪个更好用?

javascript - 检查 anchor

python - 搜索名称并从大文件中提取相应的条目 - 最快的方法 - Python 和 Regex

css - CSS 背景图像的最佳平铺尺寸

node.js - react 脚本构建 "Parse error on line 1"