2017-10-13 7 views
0

Le thème général de ce billet est middleware de nœud et les gestionnaires erreurgestionnaire d'erreur de noeud d'émission

Lorsqu'un utilisateur accède à un lien comme site.com/user/username, je veux imprimer un message si un utilisateur avec le nom d'utilisateur spécifié existe.

J'ai écrit 2 fonctions middleware pour implémenter cela: la première est users et la 2ème est errorHandler.

Mais pour une raison quelconque, l'ensemble du programme ne fonctionne pas. S'il vous plaît dites-moi où je me suis trompé. Voici le code:

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 [correspondance [1]]' << - Vous ne peut pas indexer dans un tableau d'objets comme celui-ci. Vous devez boucler le tableau pour un utilisateur où 'user.name === match [1]' –

+0

Pour être exact, il montre toujours 'User not found' – Nick

+0

exactement, db.users [match [1]] va toujours revenir 'undefined'. Vous ne faites pas la recherche correctement. –

Répondre

0

Je pense que la question est à la recherche d'une solution dans la mauvaise partie de votre objet db. votre code comme écrit recherche db.users['toby'] quand il devrait chercher db.users[0].name = 'toby' Je recommande d'utiliser la méthode array.prototype.find pour rechercher votre tableau de noms

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