2017-10-13 175 views
0

这张票的总议题是节点JS中间件和错误处理程序节点JS错误处理问题

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

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

但由于某种原因整个程序无法正常工作。请告诉我我错了哪里。 下面的代码:

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

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

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

 
function users(req, res, next) { 
 
\t var match = req.url.match(/^\/user\/(.+)/) 
 
\t if (match) { 
 
\t \t var user = db.users[match[1]]; 
 
\t \t if (user) { 
 
\t \t \t res.setHeader('Content-Type', 'application/json'); 
 
\t \t \t res.end(JSON.stringify(user)); 
 
\t \t } else { 
 
\t \t \t var err = new Error('User not found'); 
 
\t \t \t err.notFound = true; 
 
\t \t \t next(err); 
 
\t \t } 
 
\t } else { 
 
\t \t next(); 
 
\t } 
 
} 
 

 

 
function errorHandler(err, req, res, next) { 
 
\t console.error(err.stack); 
 
\t res.setHeader('Content-Type', 'application/json'); 
 
\t if (err.notFound) { 
 
\t \t res.statusCode = 404; 
 
\t \t res.end(JSON.stringify({ error: err.message })); 
 
\t } else { 
 
\t \t res.statusCode = 500; 
 
\t \t res.end(JSON.stringify({ error: 'Internal Server Error' })); 
 
\t } 
 
}

+0

'db.users [匹配[1]]'<< - 你不能像这样索引到一个对象数组。你需要循环,虽然数组为用户'user.name ===匹配[1]' –

+0

确切地说,它总是显示'User not found' – Nick

+0

,db.users [match [1]]将会返回'undefined'。你没有正确地进行查找。 –

回答

0

我认为这个问题是寻找你的数据库对象的错误部分的解决方案。作为写你的代码是寻找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)); 
} 
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'));