1

我正在创建一个用于生产的应用程序,并希望使用一个 switch 语句组合多个路由。我目前在开发中使用它并且效果很好,但是我以前没有见过这种方法,并且想知道是否有原因。使用这种方法有什么问题吗?如果是这样,真的要在答案中寻找原因。

这是我想做的,而不是创建多条路线。

router.post('/save', auth, async (req, res)=>{
    switch(req.body.action) {
        case 'user':
            result = await asyncSaveUser(req.body.data);
            break;
        case 'order':
            result = await asyncSaveOrder(req.body.data);
            break;
        default:
            result = {success:false, data: 'not valid action'};
            break;     
    }
    return res.status(200).json(result);
})

在 API 中,我会创建一个动作。

url: {baseUrl}+'/save'
body: {
    "action":"user",
    "data": {"fn": John, "ln": Doe}
}
4

1 回答 1

0

两个担忧:

  • 随着时间的推移,这一功能往往会变得相当大。请注意,您已经将逻辑隔离到单独的函数中(我稍后会回到那个)。
  • 保存用户和保存订单是根本不同的操作,但如果 URL 是/save任何一种方式,就会使记录、报告等变得更加困难。差异(用户与订单)隐藏在 POST 数据中,而不是在 URL 中。

如果您确实在一个函数中完成所有操作,则路由参数可以解决日志记录等问题。例如:

router.post('/users/:action', async function (req, res) { // Added `async`, since you're using `await`
    switch(req.params.action) {
        case 'user':
            result = await asyncSaveUser(req.body.data);
            break;
        case 'order':
            result = await asyncSaveOrder(req.body.data);
            break;
        default:
            result = {success:false, data: 'not valid action'};
            break;     
    }
    return res.status(200).json(result);
})

回过头来避免让这个函数变得过长:您可能会使用调度对象:

const actionDispatch = {
    action: async asyncSaveUser(data) {
        // ...
    },
    user: async asyncSaveUser(data) {
        // ...
    }
};
function invalidAction() {
    return {success:false, data: 'not valid action'};
}

router.post('/users/:action', async function (req, res) {
    const actionFunction = actionDispatch[req.params.action] || invalidAction;
    const result = await actionFunction(req.body.data);
    return res.status(200).json(result);
});

当然,actionDispatch对象可能会开始变得过长。您可能会对其进行更多分解,这是维护的缺点(当它们在其他地方定义时必须列出其中的功能)。


旁注:当心将async函数传递给router.post不了解它返回什么的东西()(承诺)。如果你这样做,你几乎必须将整个主体包裹在try/catch中来处理错误(除非这些处理程序有一些中间件处理承诺)。

于 2019-07-09T16:14:36.663 回答