【问题标题】:Making a function an express middleware in a route使函数成为路由中的快速中间件
【发布时间】:2017-08-05 15:46:54
【问题描述】:

所以我有一条路线,并且路线中有一些丑陋的代码,我想制作一个中间件。唯一的问题是 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();
    }

【问题讨论】:

  • 这不是中间件的用途。你想要的只是一个普通的功能。
  • 好的。中间件的用途是什么?
  • 这意味着在将request/response 传递给您的处理函数之前对其进行一些“处理”。由于逻辑需要发生在 您的处理函数中,因此不需要中间件。
  • 好的。够公平
  • 中间件实际上非常灵活,可以按照 OP @Quesofat 希望的方式使用。请参阅下面的答案。

标签: javascript node.js express


【解决方案1】:

在您的根目录app.js 中,您应该会看到您的应用正在使用的所有中间件。这些中间件是按顺序匹配的。如果它们不包含路由参数,它们自然会应用于所有请求。您的路线就在其中,它们看起来像这样: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

【讨论】:

  • 感谢您的回复。唯一的问题是中间件使用了响应对象。我如何传递它?
  • @Quesofat Middleware 自动从 express 获取这些。
  • 响应对象没有记录 api 响应。
  • @Quesofat 哦,您指的是 API 调用的结果。我以为您在谈论发送回客户端的 res 对象。您可以将 API 响应附加到 req 对象。我已经编辑了我的答案以反映这一点。 stackoverflow.com/questions/18875292/…
猜你喜欢
  • 2018-07-15
  • 1970-01-01
  • 2015-01-22
  • 2019-02-18
  • 2018-01-03
  • 2016-03-06
  • 2016-02-14
  • 1970-01-01
  • 2020-04-22
相关资源
最近更新 更多