express js条件语句选择中间件模块

Express js conditional statement to choose between middleware modules

我在 express.js 中有一个端点,它有条件地在要执行的中间件回调之间进行选择:

const middleware1 = require('./m1')
const middleware2 = require('./m2')
app.get('/call', async (req, res) => {
  if (req.code === 'something') {
    middleware1.call
  } else if (req.code === 'something else') {
    middleware2.call
  } else {
    res.send({
      done: "done"
    })
  }
})

中间件1

module.exports = {
  call : async function(req, res, next) {
    // does some async stuff with req
    // sends it as response
    res.send({data: "data"})
  }
}

middleware2 的想法类似。问题是一旦 middleware1 或 middleware2` 被调用,请求就不会关闭。但是,如果作为测试,我删除了条件语句并立即调用一个中间件,如下所示:

app.get('/call', middleware1.call); 

这立即生效,为什么?我一定是做错了什么。

尝试将 next() 添加到中间件的末尾。这样请求就会传递给堆栈中的下一个函数。更多关于中间件的信息在这里 Writing middleware for use in Express apps.

您可能需要这样做:

const middleware2 = require('./m2')
app.get('/call', async (req, res, next) => {
  if (req.code === 'something') { 
    middleware1.execute(req, res, next); // you were not calling the method
  } else if (req.code === 'something else') {
    middleware2.execute(req, res, next);
  } else {
    res.send({
      done: "done"
    })
  }
})
module.exports = {
// call is the reserved keyword use something different
  execute : async function(req, res, next) {
    // does some async stuff with req
    // sends it as response
    res.send({data: "data"})
  }
}

res.send 应该发回响应,但是,在您的情况下,似乎没有发生对任何中间件的调用。在内部,res.send 确实调用 next 来发回响应并且应该发送它。