5

reddit のような機能を備えたサイトを構築しています。ユーザーが送信したコンテンツに独自のページを取得したい。各送信には、そのページの URL に含めたい 5 文字の ID が割り当てられます。

タイトルと呼ばれるページをレンダリングするルーターファイルにこの関数があります。

exports.titles = function(req, res){
i = 0
read(function(post){
    url = post[i].URL;
    res.render('titles', {title: post[i].title, url: post[i].URL});
});

};

これは、app.js の次のステートメントによって提供されます。

app.get('/titles', home.titles); //home.js is the router file

タイトル ページには、テキスト post.title と URL post.URL のリンクがあります。ユーザーがリンク (例: domain.com/12345) をクリックすると、コンテンツが post.body の content というページに移動する必要があります。

a) URL を app.js ファイルに戻して app.get に含める、b) このルーター ファイルに app.get 関数を含める、または c) 他の方法でこれを解決するにはどうすればよいですか?

編集: mongodb コレクションであるオブジェクト「タイトル」がありますが、それは別のモジュールにあります。ただし、ルーターに追加できない理由はありません。

編集:これをapp.jsに追加して、機能するかどうかを確認しました:

app.get('/:id', function(req, res){
  return titles.findOne({ id: req.params.id }, function (err, post) {
    if (err) throw(err); 

    return res.render('content', {title: post.title, content: post.body});
   });
});

編集:動作するようになりました。私がしたことは、タイトルを domain.com/titles/12345 のようにフォーマットし、app.get('/:id', を app.get('/titles/:id, ...) に変更することだけでした。

4

1 に答える 1

16

私があなたを正しければ、私はそれを逆にします。

短縮版

  1. idURLから取得します
  2. 次に、これに関連するデータをデータベースから取得しますid
  3. そして、このデータを使用して最終ページを作成します。

URL ごとに新しいルートを作成する必要はありません。URL には何らかの変数 (ここではid) を含めることができ、Express はこの変数を取得するために URL を解析できます。次にid、適切なページを構築するために必要なデータを取得できます。

ロングバージョン

誰かがこの URL を入力すると仮定します: http://domain.com/1234. また、MongoDB コレクションで
ある変数があると仮定します。titles

次のようにルートを定義できます。

app.get('/:id', function(req, res) {
  // Then you can use the value of the id with req.params.id
  // So you use it to get the data from your database:
  return titles.findOne({ id: req.params.id }, function (err, post) {
    if (err) { throw(err); }

    return res.render('titles', {title: post.title, url: post.URL /*, other data you need... */});
  });
});

編集

最後のコメントに従っていくつかの変更を加えました...

于 2012-12-06T16:19:09.870 に答える