使功能成为路由中的快速中间件

时间:2017-03-15 03:41:57

标签: 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(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();
    }

1 个答案:

答案 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