关于 javascript:使函数成为路由中的快速中间件 | 珊瑚贝

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)
  })
  .catch(function(error) {
    res.render(‘404’);
  })
});

功能:

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);
      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 做一些”东西”。由于逻辑需要在您的处理函数中发生,因此您不需要中间件。
  • 行。很公平
  • 在您的情况下,您应该简单地拥有一个函数 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
  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 中间件会自动从 express 中获取。
  • 响应对象未记录 api 响应。
  • @Quesofat 哦,您指的是 API 调用的结果。我以为您在谈论发送回客户端的 res 对象。您可以将 API 响应附加到 req 对象。我已经编辑了我的答案以反映这一点。 stackoverflow.com/questions/18875292/…


来源:https://www.codenong.com/42800707/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9668.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?