Javascript 使函数成为路由中的快速中间件
所以我有一个路由,路由中有一些丑陋的代码,我想做一个中间件。唯一的问题是Express的文档不清晰,我的代码只有404 我怎样才能做到这一点 路线:Javascript 使函数成为路由中的快速中间件,javascript,node.js,express,Javascript,Node.js,Express,所以我有一个路由,路由中有一些丑陋的代码,我想做一个中间件。唯一的问题是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(slu
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();
}
在root
app.js
中,您应该可以看到应用程序正在使用的所有中间件。这些中间件是按顺序匹配的。如果它们不包括route参数,那么它们自然会应用于所有请求。您的路由就在其中,它们看起来像这样:app.use(“/”,routes)代码>
在app.js
中的路线下方,声明一条新路线:
const markedHtml = require('./middleware/markedHtml');
app.use('/product/:slug', markedHtml);
在/middleware/marketHtml.js
中,您的方法将显示为这样,而无需调用下一个:
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调用等,然后(pun!)运行到next()代码>调用。提示表示执行下一个适用的中间件,该中间件恰好是markedHtml
,将从中调用view render方法
如果有什么不清楚或需要额外解释,请告诉我
可以在此处找到其他文档:这不是中间件的用途。你想要的只是一个普通函数。中间件意味着什么?它意味着在将请求
/响应
传递给处理函数之前,对其执行一些“操作”。因为逻辑需要发生在处理函数中,所以中间件不是您所需要的。Fair-enough中间件实际上非常灵活,可以按照OP@Quesofat希望的方式使用。请看下面我的答案。谢谢您的回复。唯一的问题是中间件使用响应对象。如何传入?@Quesofat中间件会自动从express获取响应。响应对象不会记录api响应。@Quesofat噢,您指的是api调用的结果。我以为您在谈论发送回客户端的res
对象。您可以将API响应附加到req
对象。我编辑了我的答案以反映这一点。