Javascript 验证nodejs+express中的URL以处理错误的请求错误
嗯,在读了一些关于这个问题的东西之后,我决定问一下 核心思想很简单:检测传入的无效URL/URI,并使用相关代码/数据向客户端返回响应 通常,在处理节点中的错误时,我们使用如下语法:Javascript 验证nodejs+express中的URL以处理错误的请求错误,javascript,node.js,rest,http,Javascript,Node.js,Rest,Http,嗯,在读了一些关于这个问题的东西之后,我决定问一下 核心思想很简单:检测传入的无效URL/URI,并使用相关代码/数据向客户端返回响应 通常,在处理节点中的错误时,我们使用如下语法: if (err) { return res.status(500).json(error: {msg: err.message, stack: err.stack}); } 好吧,这很简单,但最重要的是我们要检测:嘿,如果发生错误,把这个东西射给客户 但如果它不是一个500内部?正如我所知,错误的请求错误
if (err) {
return res.status(500).json(error: {msg: err.message, stack: err.stack});
}
好吧,这很简单,但最重要的是我们要检测:嘿,如果发生错误,把这个东西射给客户
但如果它不是一个500内部?正如我所知,错误的请求错误像客户端错误一样发送,并且在提示符中有自己的堆栈、类型和消息,对吗
在阅读中,我找到了URIError构造函数,它指向一个实例,该实例表示使用ivalids URI发生的错误。所以,我们可以制作一些类似的:
if (err instanceof URIError) { /* send a handler for bad request */ };
或者我需要从头开始验证URI并创建自己的错误继承
有什么提示吗?主意提前谢谢 我通常通过定义我想要的路线来实现这一点:
app.get('/good' ... );
app.post('/alsogood' ... );
然后,要捕获未路由的URL,请执行以下操作:
app.all('*', function(req, res) {
throw new Error("Bad request")
})
然后注入一个错误处理中间件:
app.use(function(e, req, res, next) {
if (e.message === "Bad request") {
res.status(400).json({error: {msg: e.message, stack: e.stack}});
}
});
很明显,你可以得到比这复杂得多的东西,但是这个简单的想法可以让你明白这一点
另外,如果客户端试图访问一个不存在的URL,那么您可能应该将404返回给客户端。我通常通过定义我想要的路由来实现这一点:
app.get('/good' ... );
app.post('/alsogood' ... );
然后,要捕获未路由的URL,请执行以下操作:
app.all('*', function(req, res) {
throw new Error("Bad request")
})
然后注入一个错误处理中间件:
app.use(function(e, req, res, next) {
if (e.message === "Bad request") {
res.status(400).json({error: {msg: e.message, stack: e.stack}});
}
});
很明显,你可以得到比这复杂得多的东西,但是这个简单的想法可以让你明白这一点
另外,如果客户端试图访问一个不存在的URL,那么您可能应该向客户端返回404。Hmm,我现在不太明白。您正在将所有路由定义为错误请求。。。确切地说,您如何知道URL的格式是否错误?对不起,我对这件事很陌生。不,首先定义你知道的路线——这些路线将被路由到相应的控制器。但是如果有人发送的请求没有路由处理程序,那么您将抛出400。如果要将所有代码粘贴到一个新文件中并运行它,您将看到当您点击/good、/alsogood和/bad时会发生什么。您也可以使用相同的机制在控制器中的任何位置抛出新错误。哦!我明白了,真的很简单。。。谢谢你!嗯,我现在不太明白。您正在将所有路由定义为错误请求。。。确切地说,您如何知道URL的格式是否错误?对不起,我对这件事很陌生。不,首先定义你知道的路线——这些路线将被路由到相应的控制器。但是如果有人发送的请求没有路由处理程序,那么您将抛出400。如果要将所有代码粘贴到一个新文件中并运行它,您将看到当您点击/good、/alsogood和/bad时会发生什么。您也可以使用相同的机制在控制器中的任何位置抛出新错误。哦!我明白了,真的很简单。。。谢谢你!