songs
リソース用のREST APIを持っていて、id
とtitle
があり、管理者は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});
});
}
私はそれが未処理のエラーで終わるだとして失わ少しだけど、私はどのようにリロード要求を知りませんもう一度処理してください。
を作品タイトル
で照会し、データベースヒットを保存します。また、コードを2つの別々のルートに複製する必要もありません。それぞれのルートが呼び出す共通の機能を作ることができます。 – jfriend00