【问题标题】:Serving dynamic URLs with express and mongodb使用 express 和 mongodb 提供动态 URL
【发布时间】:2012-12-06 16:10:42
【问题描述】:

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

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

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, ...

【问题讨论】:

  • 什么是“内容”?这是你的观点之一吗?

标签: node.js mongodb url express


【解决方案1】:

如果我说对了,我会反其道而行之。

短版

  1. 我会从 URL 获得id
  2. 然后我将从数据库中提取与此id 关联的数据
  3. 并使用这些数据构建最终页面。

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

加长版

我假设有人输入此网址: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... */});
  });
});

编辑

我根据上次的cmets做了一些修改……

【讨论】:

  • 呃,我很确定我没有后置模型。那究竟是什么?听起来很有用。
  • 模型只是一个“对象”,它可以帮助您将数据拉入/推送到数据库。那是一个抽象层,它真的可以帮助你。也许您可以添加一些关于如何从数据库中获取数据的代码?
  • 我在另一个模块中有这个函数:exports.read = function(callback){ titles.find().toArray(function(err, result){ if (err) throw err; callback(result); }); }; 它将检索到的对象传递给路由器文件中的这个函数:read = function(callback){ postdb.read(function(post){ callback(post); }); }; 现在我已经将它设置为按条目号解析数组,但我打算将其更改为使用 ID。
  • 我找到了这个网站:yiiframework.com/doc/blog/1.1/en/post.model 你说的是这个吗?
  • 我编辑了答案。也许它会更接近你正在寻找的东西。但是,如果您可以编辑您的问题并添加更多代码和文件架构... =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多