Making a function an express middleware in a route
所以我有一条路线,并且路线中有一些丑陋的代码,我想制作一个中间件。唯一的问题是 Express 的文档不清楚,我的代码只有 404s。
我怎样才能做到这一点?
路线:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
router.get(‘/product/:slug’, function(req, res) {
//route params var slug = req.params.slug; var productResp; //scope up api response to pass to render() console.log(slug); //api call Prismic.api(“https://prismic.io/api”).then(function(api) { return api.getByUID(‘product’ , slug); }).then(function(response) { app.use(markedHtml) |
功能:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
var markedHtml = function(req, res, next) {
var md_col_1 = response.data[“product.markdown-col-one”].value[0].text; var md_col_1_1 = response.data[“product.markdown-col-one”].value[1].text; var md_col_2 = response.data[“product.markdown-col-two”].value[0].text; var md_col_2_1 = response.data[“product.markdown-col-two”].value[1].text; var md_col_3 = response.data[“product.markdown-col-three”].value[0].text; var md_col_3_1 = response.data[“product.markdown-col-three”].value[1].text;
var html_col_1 = marked(md_col_1); res.render(‘product-template’, { next(); |
- 这不是中间件的用途。你想要的只是一个正常的功能。
- 好的。中间件的用途是什么?
- 这意味着在将它们传递给您的处理函数之前对 request/response 做一些”东西”。由于逻辑需要在您的处理函数中发生,因此您不需要中间件。
- 行。很公平
- 在您的情况下,您应该简单地拥有一个函数 markedHtml(req, res, response) 并调用它来代替您的 app.use(markedHtml)
- 中间件实际上非常灵活,可以按照 OP @Quesofat 希望的方式使用。请看下面我的回答。
在您的根目录 app.js 中,您应该会看到您的应用正在使用的所有中间件。这些中间件是按顺序匹配的。如果它们不包含路由参数,它们自然会应用于所有请求。您的路线就在其中,它们看起来像这样:app.use(‘/’, routes);.
在 app.js 中的路线下方,声明一个新路线:
1
2 |
const markedHtml = require(‘./middleware/markedHtml’);
app.use(‘/product/:slug’, markedHtml); |
在 ./middleware/marketHtml.js 中,您的方法将如下所示,没有 next 调用:
1
2 3 4 5 6 7 8 9 10 |
const markedHtml = function(req, res, next) {
// Do stuff with req.apiResponse here. … res.render(‘product-template’, { module.exports = markedHtml; |
您的原始路线将如下所示:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
router.get(‘/product/:slug’, function(req, res, next) {
//route params var slug = req.params.slug; var productResp; //scope up api response to pass to render() console.log(slug); //api call |
基本上,您的原始路由将接收客户端请求,执行 API 调用等,然后(双关语!)运行到 next(); 调用。该提示表示执行下一个适用的中间件,恰好是 markedHtml,将从中调用视图渲染方法。
如果有任何不清楚或需要额外解释,请告诉我。
可以在此处找到其他文档:http://expressjs.com/en/4x/api.html#app.use
- 感谢您的回复。唯一的问题是中间件使用了响应对象。我如何传递它?
- @Quesofat 中间件会自动从 express 中获取。
- 响应对象未记录 api 响应。
- @Quesofat 哦,您指的是 API 调用的结果。我以为您在谈论发送回客户端的 res 对象。您可以将 API 响应附加到 req 对象。我已经编辑了我的答案以反映这一点。 stackoverflow.com/questions/18875292/…
来源:https://www.codenong.com/42800707/