2016-03-08 77 views
2

TL; DR 假设客户端响应以其他方式管理,则不调用beforeRemote中next()的潜在问题/缺点是什么拒绝beforeRemote,我可以使用res.send还是必须使用next()?

嗨。

我有一个模型中的基础验证函数beforeRemote钩子,如果某些条件不符合,需要返回拒绝给客户端。

我在早期的路由拦截中使用res.send,它完美地工作,并且在beforeRemote中的res.send也似乎工作。但是我很担心文档非常清楚地说明必须调用“next”,这意味着我无法手动res.send。

我如何做到这一点在前面的路线

res.statusCode = 401; 
return res.send("Access denied"); 

如何发挥它的安全

err = new Error("Access Denied"); 
err.status = 401; 
delete err.stack; 
return next(err); 

我更喜欢第一种方法,因为我没有花“时间”抛出错误并在回拨之前删除堆栈跟踪(在其他地方需要,因此不能全局删除)。 res.send对我来说似乎更清洁,但这可能是一种误解? 最后,我不确定是否有任何长期缺陷没有结束远程“在环回上下文”((ctx。)res.send是“只是”表达)。

回答

0

第二种方法更灵活。它允许您在发送回复之前执行一些操作。例如,您可能想要记录所有被拒绝的请求。或者无论错误发生在何处,都可能重定向到家中。

使用next(err)所有你需要做的就是增加一些中间件这样做,一边用第一种方法,将最有可能要求在很多地方重复代码。或者,最终为了避免这种情况,写一些能够做到next能让你做的事情。

+0

是。接下来传递“正确”的方式将允许一些额外的处理,res.send将在哪里结束链。但在这种情况下,这正是我想要的,这是一个基本的拒绝/要求,我没有想到除了拒绝客户之外,还有什么需要做任何事情。 –

+0

所以问题的核心仍然是:在beforeRemote –

+0

中调用next()的潜在问题/缺点是什么我想说你的情况没有,你只是结束请求/响应循环早。但是可能有一个缺点。既然你没有接下来的调用,我很肯定你不能使用[debug strings]正确调试你的服务器(https://docs.strongloop.com/display/public/LB/Setting+debug+strings )用于强大的远程处理。 – Overdrivr

相关问题