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 来发回响应并且应该发送它。
我在 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 来发回响应并且应该发送它。