node 如何来捕捉错误呢?像404 这样的
发布于 10 年前 作者 hc2014 7248 次浏览 最后一次编辑是 8 年前

我看了下网上写的大部分都是说在所有的路由规则之后写上

        res.render('404.html', {
        title: 'No Found'
    })
});``` 
这样写 确实是可以实现404的捕捉的,但是我个人总觉得这种做法有点投机技巧,而且假如我在想其他的错误呢?
所以我的想法是能不能直接在http里面获取到404相关的信息? 但是我查看了request的信息 没有看到有关的信息,
```headers: 
      { host: 'localhost:3000',
        connection: 'keep-alive',
        accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36',
        'accept-encoding': 'gzip,deflate,sdch',
        'accept-language': 'zh-CN,zh;q=0.8',
        cookie: 'username=admin',
        'if-none-match': 'W/"9c-2619173066"' },```
所以想请教各位是如何捕捉各种错误的?
18 回复

问题没解决 帖子不能沉

@thesadboy 顺序反了吧,我得先知道404的错误才能渲染404的试图把,你们都是怎么做的呢?

各位前辈你们是怎么做404页面的呢?

不明白,路由中没找到对应的处理,最后输出404,那你根据什么来处理非404呢?

能举个例子吗?

@think2011 输出404 我这里有写好的自定义中间件,可是问题在于 假如我现在随便输入一个路由,这个路由指向的页面肯定是没有的,那么我程序应该如何来判断这个页面是找不到的呢? 我看很多人都是在所有路由之后写404的处理,可是假如我还想输出其他的错误呢?如果想输出500,503 等等其他的错误呢?又该如何实现? 所以我猜想能不能直接开始就捕捉到错误代码,然后我再输出对应的页面呢?

哎呀,我去找遍了全世界都是把404的路由放在最后,莫非真的只有这种方式来处理了?

@hc2014 据说有人 是把所有支持的路由记录下来,然后http过来,看请求头就知道自己支不支持。 不过我不理解,在所有路由后处理404有什么问题, 都已经到最后了,还会想输出什么错误呢?除了404外。

@hc2014 作为菜鸟,我的理解是错误代码(500 503 404之类的)是自己写的,所以只要没办法在请求路由中得到错误代码。 好吧,我想我没能理解。

@macross2005 我懂你的意思,404放最后的确是可以解决问题的,可是呢 错误代码肯定不是只有404一个对吧?如果把404放最后那就相当于是if else的感觉 把所有可能性排除完了 剩下的就是404了, 但是如果我还想获取其他的错误代码呢?打个比方来说 我还想获取 500,503 那样的话,切先不说500,503这两个错误代码的意思,那我就是想这么做,又该把 这两个的 路由放哪呢?我该怎么写呢? 不知道是我自己理解错了,还是怎样?我还真不行 就我一个人是这样想的

@think2011 我也是菜鸟…那你把404 的路由放最后那500,503 你是怎样写的呢?

@thesadboy 你的意思是 在404 路由后面 接着处理 其他的错误代码吗?

@hc2014 如果让你用别的语言来实现你怎么作?

@hc2014

客户端发送一个HTTP请求到服务器端,你这边是这么处理的:

switch(req.path) {
  case ROUTE1:
    // 路由1的处理
    // 一切正常
    res.statusCode =200;
    res.end('OK'); 
    break;
  case ROUTE2:
    // 路由2的处理
    // 经过检查,用户无权访问这个资源
    res.statusCode=403;
    res.end('Forbidden');  
    break;
  // ...
  case ROUTEn:
    // 路由n的处理
    // 服务器端出错了
   res.statusCode=500;
   res.end('Internal Server Error');
   break;
  default:
    // 显然,其它所有的请求路由都是未定义的,所以返回404很自然。
    res.statusCode = 404;
   res.end('NOT FOUND'); 
};

也就是说,所有的状态码是由服务器返回给客户端的,不是HTTP请求带来的。

@bnuhero 刚才看了下https://github.com/strongloop/express/blob/master/examples/error-pages/index.js, 然后再看看你的 我想我应该是明白了,给你点个赞!

stackoverflow已经解决这个问题,请参考Node.js/Express - Render error when page not found

这个有那么难理解吗,所有的路由规则都不符合自然就是404了,至于500那不是还有一个带四个参数的错误处理吗

状态码是服务器根据浏览器的request响应后设置的, 404代表响应正常, 服务器没有出错, 但是路由不匹配的情况, 一般框架里面都做好了, 在路由不匹配也无错误的时候, 框架自动设置404状态码返回, 有错误的时候, 框架设置500状态码, 重定向的时候,框架设置302状态码, 成功的时候框架设置状态码为200

当然可以自己更语义化的设置状态码

回到顶部