此故障单的一般主题是节点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' }));
}
}
答案 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));
}