节点js错误处理程序问题

时间:2017-10-13 16:44:24

标签: javascript node.js middleware

此故障单的一般主题是节点js中间件和错误处理程序

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

我编写了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' }));
	}
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我认为问题是在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));
}