Nodejs connet使用错误处理中间组件 浏览器显示Cannot GET /是因为什么?

nodejs connet自定义错误处理器的时候 打开监听的地址 浏览器显示Cannot GET

  • 下面是代码

var connect = require('connect');
connect()
.use(hello)
.use(pets)
.use(users)
.use(errorHandler)
.listen(3000);
function hello(req, res, next) {
  if (req.url.match(/^\/hello/)) {
    res.end('Hello World\n');
  } else {
    next();
  }
}
var db = {
  users: [
    { name: 'qaz' },
    { name: 'wsx' },
    { name: 'edc' }
  ]
};
function users(req, res, next) {
  var match = req.url.match(/^\/user\/(.+)/);
  if (match) {
    var user = db.users[match[1]];
    if (user) {
      res.setHeader('Content-Type', 'application/json');
      res.end(JSON.stringify(user));
    } else {
      var err = new Error('User not found');
      err.notFound = true;
      next(err);
    }
  } else {
    next();
  }
}
function pets(req, res, next) {
  if (req.url.match(/^\/pet\/(.+)/)) {
    foo();
  } else {
    next();
  }
}
function errorHandler(err, req, res, next) {
  console.error(err.stack);
  res.setHeader('Content-Type', 'application/json');
  if (err.notFound) {
    res.statusCode = 404;
    res.end(JSON.stringify({ error: err.message }));
  } else {
    res.statusCode = 500;
    res.end(JSON.stringify({ error: 'Internal Server Error' }));
  }
}

访问http://localhost:3000/hello 可显示出hello world
但访问pets时 直接显示Cannot GET /pets 而不是执行有err参数的组件

阅读 6.6k
2 个回答

可能是因为最后一步你没往errorHandler中传任何参数吧,试着把users最后的next()里传入参数就正常报错了

要执行有err参数的方法,一定要next()中有参数,比如next(new Error("sorry! not found"));

不会吧,因为你的errorHandler前面的中间件是users,所以把error写在users中的next中了。请看users中的变化。

function users(req, res, next) {
  var match = req.url.match(/^\/user\/(.+)/);
  if (match) {
    var user = db.users[match[1]];
    if (user) {
      res.setHeader('Content-Type', 'application/json');
      res.end(JSON.stringify(user));
    } else {
      var err = new Error('User not found');
      err.notFound = true;
      next(err);
    }
  } else {
    next(new Error("错了"));
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题