Node.js参数化路由 - 好的还是坏的做法?

时间:2015-04-02 19:30:58

标签: javascript node.js express

这是我的代码:

router.delete('/delete-:object', function(req, res) {
   var query;
   var id = req.body.id;

   switch (req.params.object) {

       case 'news' :
           query = queries['news_delete'];
           break;

       case 'member' :
           query = queries['member_delete'];
           break;

       case 'account' :
           query = queries['account_delete'];
           break;

       default :
           res.sendStatus(404);
           return;
   }

   connection.query(query, id);
   res.sendStatus(200);
});

这种做法是否被视为良好做法,还是应该为我的所有路线创建单独的router.delete功能?请解释原因。

2 个答案:

答案 0 :(得分:1)

从技术角度来看 - 我认为这种方法没有任何问题。

但是,您是否需要在对象之前使用'delete-'前缀?您已经知道正在通过HTTP发出删除,所以它相当重复。

这是一个意见问题,但我会用:

router.delete('/:object', function(req, res) {
  var queryName = req.params.object + '_delete';

  if(queries.hasOwnProperty(queryName) === false) {
    res.sendStatus(404);
    return;
  }

  connection.query(queries[queryName], req.body.id);
  res.sendStatus(200);
});

或者,您可以重构queries对象,使其具有delete字段,该字段是删除查询的对象,并避免完全更改名称:

var queries = {
  delete: {
    'news': '...',
    'member': '...',
    'account': '...'
  }
};

现在,删除路线的对象会将1:1映射到您的queries.delete对象。

router.delete('/:object', function(req, res) {
  if(queries.hasOwnProperty(req.params.object) === false) {
    res.sendStatus(404);
    return;
  }

  connection.query(queries[req.params.object], req.body.id);
  res.sendStatus(200);
});

此处的另一个优点是,如果添加新的对象类型,则无需像原始问题那样不断更新交换机。

答案 1 :(得分:0)

我说好的做法,因为它非常通用,你总是应该避免重复愚蠢的代码,因为你可能会犯错误

你甚至可以概括一点

router.delete('/delete-:object', function(req, res) {
var id = req.body.id;

connection.query(queries[req.params.object], id);
res.sendStatus(200);
});

(假设您以与对象相同的方式命名查询

我还假设您将保护路线,以便没有登录的人可以删除对象。