2017-10-13 173 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'));