Node.js Nodejs封装发送中间件的最佳实践

Node.js Nodejs封装发送中间件的最佳实践,node.js,middleware,Node.js,Middleware,好的,我现在正在学习更多的node.js,并决定在我创建的一个小api中尝试一些基本的中间件。我想知道如何包装一个成功的请求。这是我的方法 控制器示例 exports.getTask = async function (req, res, next) { try { const task = await db.Task.findOne( { where: { id: req.p

好的,我现在正在学习更多的node.js,并决定在我创建的一个小api中尝试一些基本的中间件。我想知道如何包装一个成功的请求。这是我的方法

控制器示例

exports.getTask = async function (req, res, next) {
    try {
        const task = await db.Task.findOne(
            {
                where: {
                    id: req.params.taskId,
                    userId: req.params.userId
                }
            });
        if (task) {
            req.locals.data = task;
            res.status(httpStatus.OK);
            next();
        }
        res.status(httpStatus.NOT_FOUND);
        next();
    } catch (err) {
        next(err);
    }
};
中间件

exports.success = function(req, res, next) {
    const success = res.statusCode < 400;
    const successResponse = {
        timestamp: new Date().toUTCString(),
        success: success,
        status: res.statusCode
    };

    if (success) {
        successResponse.data = req.locals.data;
    }
    res.send(successResponse);
    next();
};
exports.success=函数(req、res、next){
const success=res.statusCode<400;
常量成功响应={
时间戳:新日期().ToutString(),
成功:成功,
状态:res.statusCode
};
如果(成功){
successResponse.data=req.locals.data;
}
res.send(成功响应);
next();
};
我认为为每个请求设置
req.locals.data
,然后调用next
res.status(status)
不是很好,也许我只是以错误的方式处理了这种情况


你怎么能让这更好

在这种情况下,使用快速中间件概念(调用
next()
)可能是一种过分的做法

我将通过创建成功路径的抽象来实现这一点。考虑这样的事情:

const resWithSuccess = (req, res, data) => {
    res.json({
      data: data,
      timestamp: new Date().toUTCString(),
      // success: res.statusCode < 400, // --> actually you don't need this,
      //                                       since it will always be true
      // status: res.statusCode // --> or whatever else "meta" info you need
    });
};

附言:。。。您可以使用快速中间件概念(调用
next()
)获取错误路径。

谢谢!这实际上是我的第一个方法。我认为将响应封装在每个控制器中会有点过于夸张,但这比使用中间件要干净得多。但是我不理解PS。你的意思是用类似next(错误)的错误调用next来调用错误处理程序?这是我已经在做的事情。是的,没错。您的错误路径(调用
next(error)
)看起来没有问题。@Rib,如果这回答了您的问题,我希望您通过单击来接受我的回答。这向社区表明,你已经找到了一个解决方案,给你和我都带来了一些声誉,而且它可能会通过让人们注意到你的问题来帮助遇到类似问题的人。
exports.getTask = async function (req, res, next) {
    // .... bla bla
    if (task) {
        resWithSuccess(tank);
    }
};