Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使函数成为路由中的快速中间件_Javascript_Node.js_Express - Fatal编程技术网

Javascript 使函数成为路由中的快速中间件

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

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

在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
对象。我编辑了我的答案以反映这一点。