5

我正在构建一个具有类似 reddit 功能的网站。我希望用户提交的内容有自己的页面。每个提交都分配了一个 5 个字符的 ID,我希望该 ID 出现在该页面的 URL 中。

我在路由器文件中有这个函数,它呈现一个名为标题的页面:

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)时,他们应该被带到一个名为 content 的页面,其内容为 post.body。

我如何 a) 将 URL 传递回我的 app.js 文件以包含在 app.get 中,b) 在此路由器文件中包含 app.get 函数,或 c) 以任何其他方式解决此问题?

编辑:我确实有一个对象'titles',它是一个 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. 我会id从 URL中获取
  2. 然后我会从数据库中提取与此相关的数据id
  3. 并使用这些数据来构建最终页面。

您无需为每个 URL 创建新路由。URL 可以包含一些变量(这里是id),Express 可以解析 URL 以获得这个变量。然后,id您可以从中获取构建正确页面所需的数据。

长版

我假设有人输入此 URL http://domain.com/1234:。
我还假设您有一个变量titles,它是一个 MongoDB 集合。

您可以像这样定义路由:

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 回答