2017-05-10 4 views
0

songsリソース用のREST APIを持っていて、idtitleがあり、管理者はGET /songs/:idを直接実行できますが、一般ユーザーはGET /songs/:titleからしかアクセスできません。だから、リクエストURLを書き換えて、エクスプレスで同じリクエストで情報を保持するにはどうすればよいですか?

一般的なユーザーのようなリソースにアクセスしようとすると:彼はGET /songs/hala_madridにリダイレクトする必要がありますGET /songs/9248を要求することにより、

{ 
    "id":9248, 
    "title": "Hala Madrid" 
} 

私は2つの異なるルートハンドラを持ち、クエリを繰り返すことができます。しかし、私は本当に2回質問したくありません。だから私はURLをリセットして、見つけた曲をreq.songに割り当てることができると思った。

私は、次のルートを設定しようとした単一getのコントローラメソッドを実装します。

router.get('/:id([0-9]+)', songs.get); 

router.get('/:title', songs.get); 


function get(req, res, next) { 
    let { id, title} = req.params; 
    console.log(id, title); 
    let permalink = id || title; 
    let field = isNaN(permalink) ? 'title' : 'id'; 
    if (req.song) { 
    let { song } = req; 
    return res.render('app', {song, title: 'song', page: 'song'}); 
    } 
    queries.getSong(field, permalink).then(result => { 
    let song = result[0]; 
    if (req.session.user.role === 'user' && field === 'id') { 
     req.song = song; 
     req.url = `/songs/${song.title}`; 
     return next(); 
    } 
    return res.render('app', {song, title: 'song', page: 'song'}); 
    }) 
    .catch(err => { 
    console.error(err); 
    return res.status(500).json({error: err}); 
    }); 
} 

私はそれが未処理のエラーで終わるだとして失わ少しだけど、私はどのようにリロード要求を知りませんもう一度処理してください。

+0

を作品タイトル

で照会し、データベースヒットを保存します。また、コードを2つの別々のルートに複製する必要もありません。それぞれのルートが呼び出す共通の機能を作ることができます。 – jfriend00

答えて

0

多分私は何かを誤解していますが、2つのパラメータが必要ですか?パラメータは数であり、ユーザが「ユーザ(私は仮定し、その管理者)とIDによって、その後のクエリでない場合

router.get('/songs/:idortitle', function(req,res,next) { 
    const permalink = req.params.idortitle; 
    const songQuery !isNaN(permalink) && !req.session.user.role ==='user' ? queries.getSong('id',permalink) :queries.getSong('title',permalink); 

    songQuery.then(result => { 
     res.render('app', {song, title: 'song', page: 'song'}); 
    }).catch(e => { 
     console.error(err); 
     return res.status(500).json({error: err}); 
    }); 
}); 

この場合はちょうどチェックします。それ以外の場合は、おそらくキャッシュになりますクエリをリダイレクトした後ので、あなただけの最後のN個のクエリを開催しました小さな小さなキャッシュを作成することができますので、/歌/ 9248および/歌/ hala_madridが

+0

いいえ、私は 'id'か' title'のいずれかのパラメータを受け取ります – diegoaguilar

関連する問題