最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

Express asyncawait错误处理程序中的动态响应状态

IT培训 admin 4浏览 0评论

Express async / await错误处理程序中的动态响应状态

我想用异步/ await替换我的Express路由中的promises链。这使代码更干净,更易读。首先看看我的代码。

我之前有过的:

app.post('/search', (req,res) => {
    sendRequest(req.body).then( searchDetails => {
        res.send(searchDetails);
    }).catch( error => {
        res.status(404).send(error)
    });
});

当前代码:

app.post('/search', asyncMiddleware(async (req,res) => {
    const result = await sendRequest(req.body);
    res.send(result);
}));

这看起来如何异步中间件:

const asyncMiddleware = checkedFunction => (req, res) => {
    Promise
        .resolve(
            checkedFunction(req, res)
        )
        .catch( error => {
            res.status(400).send(error)
        });
};

当我有包含多个错误状态的路由时,问题就开始了。

app.delete('/delete/:id', authenticate, (req, res) => {
    const id = req.params.id;

    if (!ObjectID.isValid(id)) {
      return res.status(404).send();
    }

    User.findOneAndDelete({
        _id: id,
        _user: req.user._id
    }).then((todo) => {
      if (!todo) {
        return res.status(404).send();
      }

      res.send({todo});
    }).catch((e) => {
      res.status(400).send();
    });
});

我怎么能让asyncMiddleware返回状态取决于错误?

回答如下:

asyncMiddleware在这里检查是否有任何错误发生或checkedFunction故意抛出,即快速路线处理程序。如果你想对asyncMiddleware说些什么,你需要像对/search一样用它包装你的路由处理程序,然后你需要抛出涉及你的错误信息的特定错误/对象:

app.delete('/delete/:id', authenticate, asyncMiddleware(async (req, res) => {
    const id = req.params.id;

    if (!ObjectID.isValid(id)) {
      throw {
          status: 404,
          message: 'id not valid'
      }
    }

    try {
        const todo = await User.findOneAndDelete({
            _id: id,
            _user: req.user._id
        });

        if (!todo) {
            throw {
                status: 404,
                message: 'todo not found'
            }
        }
        res.send({todo});
    } catch (e) {
        throw {
            status: 400,
            message: 'mongodb error'
        }
    }
}));

然后异步中间件可以发送状态作为响应

const asyncMiddleware = checkedFunction => (req, res) => {
    Promise
        .resolve(
            checkedFunction(req, res)
        )
        .catch( error => {
            res.status(error.status).send(error.message)
        });
};

您可以创建内置的Error对象而不是自定义的对象来跟踪错误调用堆栈,但我认为您不需要这里。

Express async / await错误处理程序中的动态响应状态

我想用异步/ await替换我的Express路由中的promises链。这使代码更干净,更易读。首先看看我的代码。

我之前有过的:

app.post('/search', (req,res) => {
    sendRequest(req.body).then( searchDetails => {
        res.send(searchDetails);
    }).catch( error => {
        res.status(404).send(error)
    });
});

当前代码:

app.post('/search', asyncMiddleware(async (req,res) => {
    const result = await sendRequest(req.body);
    res.send(result);
}));

这看起来如何异步中间件:

const asyncMiddleware = checkedFunction => (req, res) => {
    Promise
        .resolve(
            checkedFunction(req, res)
        )
        .catch( error => {
            res.status(400).send(error)
        });
};

当我有包含多个错误状态的路由时,问题就开始了。

app.delete('/delete/:id', authenticate, (req, res) => {
    const id = req.params.id;

    if (!ObjectID.isValid(id)) {
      return res.status(404).send();
    }

    User.findOneAndDelete({
        _id: id,
        _user: req.user._id
    }).then((todo) => {
      if (!todo) {
        return res.status(404).send();
      }

      res.send({todo});
    }).catch((e) => {
      res.status(400).send();
    });
});

我怎么能让asyncMiddleware返回状态取决于错误?

回答如下:

asyncMiddleware在这里检查是否有任何错误发生或checkedFunction故意抛出,即快速路线处理程序。如果你想对asyncMiddleware说些什么,你需要像对/search一样用它包装你的路由处理程序,然后你需要抛出涉及你的错误信息的特定错误/对象:

app.delete('/delete/:id', authenticate, asyncMiddleware(async (req, res) => {
    const id = req.params.id;

    if (!ObjectID.isValid(id)) {
      throw {
          status: 404,
          message: 'id not valid'
      }
    }

    try {
        const todo = await User.findOneAndDelete({
            _id: id,
            _user: req.user._id
        });

        if (!todo) {
            throw {
                status: 404,
                message: 'todo not found'
            }
        }
        res.send({todo});
    } catch (e) {
        throw {
            status: 400,
            message: 'mongodb error'
        }
    }
}));

然后异步中间件可以发送状态作为响应

const asyncMiddleware = checkedFunction => (req, res) => {
    Promise
        .resolve(
            checkedFunction(req, res)
        )
        .catch( error => {
            res.status(error.status).send(error.message)
        });
};

您可以创建内置的Error对象而不是自定义的对象来跟踪错误调用堆栈,但我认为您不需要这里。

发布评论

评论列表 (0)

  1. 暂无评论