基于数据库条目的动态 express.js 路由,无需重新启动
Dynamic express.js routes based on database entries with no restart
我用自定义 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 table 中插入新的 slug 时,我都必须重新启动我的节点服务器。
你知道如何避免这种情况吗?
谢谢!
这可能不是完整的答案,但这里有一些与您正在寻找的内容相符的内容。
- 确保我们接受路线上的任何鼻涕虫
- 我使用异步函数等待来自数据库的结果
- 渲染索引视图(如果找到 slug)或者如果在 table
中没有找到条目则用 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" });
});
});
我用自定义 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 table 中插入新的 slug 时,我都必须重新启动我的节点服务器。 你知道如何避免这种情况吗? 谢谢!
这可能不是完整的答案,但这里有一些与您正在寻找的内容相符的内容。
- 确保我们接受路线上的任何鼻涕虫
- 我使用异步函数等待来自数据库的结果
- 渲染索引视图(如果找到 slug)或者如果在 table 中没有找到条目则用 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" });
});
});