节点 js 错误处理程序问题

Node js error handler issue

这张票的一般主题是节点 js 中间件和错误处理程序

当用户访问 site.com/user/username 之类的 link 时,如果存在具有指定用户名的用户,我想打印一条消息。

我写了 2 个中间件函数来实现它:第一个是 users,第二个是 errorHandler

但由于某种原因,整个程序无法运行。请告诉我哪里出错了。 这是代码:

let connect = require('connect');
let port = 3000;

let api = connect()
 .use(users)
 .use(errorHandler)
 .listen(port);

var db = {
 users: [
  { name: 'tobi' },
  { name: 'loki' },
  { name: 'jane' }
 ]
};

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 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' }));
 }
}

const users = [
  { name: 'tobi' },
  { name: 'loki' },
  { name: 'jane' }
];

findUser = userName => { for (let user of users) if (user.name === userName) return user; }

console.log(findUser('tobi'));

我认为问题是在 db 对象的错误部分寻找解决方案。您编写的代码正在寻找 db.users['toby'] 而它应该寻找 db.users[0].name = 'toby' 我建议使用 array.prototype.find 方法来搜索您的名称数组

function users(req, res, next) {
  let match = req.url.match(/^\/user\/(.+)/)

  if (!match) { next() }

  let user = db.users.find(v => v.name === match);

  if (user === undefined) {
    let err = new Error('User not found')
    err.notFound = true;
    next(err);
  }

  res.setHeader('Content-Type', 'application/json');
  res.end(JSON.stringify(user));
}