【问题标题】:Dynamic express.js routes based on database entries with no restart基于数据库条目的动态 express.js 路由,无需重新启动
【发布时间】:2020-10-07 10:01:50
【问题描述】:

我已经使用自定义 Express 实例构建了一个 KeystoneJS v5 app 来提供数据。 我的数据存储在 Postgres 数据库中,其中包含以下模型:

CREATE TABLE "Link" (
    id integer DEFAULT PRIMARY KEY,
    customer text,
    slug text
);

我已经根据 slug 属性构建了动态路由:

knex('Link').select('slug').then(function(result){
  const data = result.map(x => x.slug)
  data.forEach(url => {
    express.get(`/${url}`, function (req, res) {
      res.render('index');
    })
  });
});

一切都按预期工作,但每次在 Link 表中插入新的 slug 时,我都必须重新启动节点服务器。 你知道如何避免这种情况吗? 谢谢!

【问题讨论】:

  • 应该是相反的,你的快速获取应该接受 slug 作为参数,然后你可以检查 slug 是否存在于表中,否则你可以返回 404 或重定向到不同的页面。您必须重新启动的原因是因为 select 仅在服务器启动时运行。

标签: javascript node.js express keystonejs


【解决方案1】:

这可能不是完整的答案,但这里有一些您正在寻找的内容。

  1. 确保我们接受路线上的任何蛞蝓
  2. 我使用了一个异步函数来等待来自数据库的结果
  3. 呈现索引视图(如果找到 slug)或在表中未找到条目时回复 404

警告,我没有使用过 keystoneJS 或这个 knexjs 包,所以它可能不是 100% 正确,但应该是我们正在努力实现的一个很好的例子。如果没有找到结果,我假设 knexjs 会拒绝承诺,但我不确定。

express.get(`/:slug`, async function (req, res) {
    try {
        const result = await knex('Link')
            .where({ slug: req.params.slug })
            .select('id');

        return res.render('index');
    } catch {
        return res.status(404).send({ message: "Not found" });
    }
});

如果您运行的是旧版本的 Node.js,这里有一个没有异步的版本。

express.get(`/:slug`, function (req, res) {
    knex('Link')
        .where({ slug: req.params.slug })
        .select('id')
        .then((result) => {
            return res.render('index');
        })
        .catch(() => {
            return res.status(404).send({ message: "Not found" });
        });
});

【讨论】:

  • 哇,这就是我需要的建议!谢谢!由于 knex,我只需要调整您所说的内容,因为即使数据库中没有条目,它也会始终向我发送响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 2017-08-16
  • 1970-01-01
  • 2016-05-28
  • 2020-10-28
  • 2016-10-11
  • 1970-01-01
相关资源
最近更新 更多