所以我有一条路线,我在路线中有一些丑陋的代码,我想制作一个中间件。唯一的问题是Express的文档不清晰,我的代码只有404.
我怎样才能做到这一点?
路线:
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)
})
.catch(function(error) {
res.render('404');
})
});
功能:
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);
var html_col_1_1 = marked(md_col_1_1);
var html_col_2 = marked(md_col_2);
var html_col_2_1 = marked(md_col_2_1);
var html_col_3 = marked(md_col_3);
var html_col_3_1 = marked(md_col_3_1);
res.render('product-template', {
product: response,
md_one: html_col_1,
md_one_1: html_col_1_1,
md_two: html_col_2,
md_two_1: html_col_2_1,
md_three: html_col_3,
md_three_1: html_col_3_1,
})
next();
}
答案 0 :(得分:1)
在您的根app.js
中,您应该会看到您的应用正在使用的所有中间件。这些中间件按顺序匹配。如果它们不包含route参数,它们将自然地应用于所有请求。您的路线就在其中,它们看起来像这样:app.use('/', routes);
。
在app.js
的路线下方,声明一个新路线:
const markedHtml = require('./middleware/markedHtml');
app.use('/product/:slug', markedHtml);
在./middleware/marketHtml.js
中,您的方法会如此显示,而不会调用next
:
const markedHtml = function(req, res, next) {
// Do stuff with req.apiResponse here.
...
res.render('product-template', {
...
});
}
module.exports = markedHtml;
您的原始路线如下:
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
Prismic.api("https://prismic.io/api").then(function(api) {
return api.getByUID('product' , slug);
}).then(function(response) {
req.apiResponse = response;
next();
})
.catch(function(error) {
res.render('404');
});
});
基本上,您的原始路由将接收客户端请求,执行API调用等,然后(双关语)进入next();
调用。该提示表示执行下一个适用的中间件,恰好是markedHtml
,从中调用视图呈现方法。
如果有任何不清楚或需要其他解释,请告诉我。
可以在此处找到其他文档:http://expressjs.com/en/4x/api.html#app.use