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

Node.JS服务层设计

IT培训 admin 4浏览 0评论

Node.JS服务层设计

我有一个非常简单的express js服务器,该服务器接受来自客户端的请求,执行一些业务逻辑并响应该客户端。请求-响应管道由控制器处理,业务逻辑在服务层内部执行。该代码可以正常工作,但是我不确定从服务层向控制器返回错误的方式是否正确。

控制器看起来像这样:

async createAnOrder(req, res, next) {
    try {

        // Input validations
        if (!req.body.name){
            throw new ClientFacingError(ERROR_CODES.BAD_REQUEST, "Name is missing")
        }

        let newOrder = new Order();
        let validationDictionary = new ValidationDictionary();

        if (!await orderService.createOrder(newOrder, validationDictionary)){
            return next(new ClientFacingError(ERROR_CODES.BAD_REQUEST, validationDictionary.getErrorMessage()));
        }

        res.json({
            orderId: newOrder.id
        })

    } catch (err) {
        if (err instanceof ClientFacingError) {
            res.status(err.code).json({ message: err.message })
        } else {
            res.status(500).json({ message: "Internal Error" })
        }
    }
}

orderService看起来像这样:

async createOrder(newOrder, validationDictionary) {

    // Business logic validation
    if (await orderDb.hasOrder(newOrder)) {
        validationDictionary.addError("Invalid Order", "Order already exists");
        return false;
    }

    await orderDb.createOrder(newOrder);
    return true;
}

我试图将业务层与其他所有层之间的关注点分离。我还希望在服务层方法和控制器之间建立智能合约。

我认为我想做的是:

  1. 输入验证发生在控制器(基础结构)层,而与业务相关的验证仅发生在服务层
  2. 如果操作成功,服务层方法将返回true,如果存在业务验证错误,则将返回false。
  3. 服务层方法抛出的任何错误都是运行时错误,这些错误由控制器捕获并作为内部错误返回给客户端。

另一种方法是遵守CQS原则。服务层方法不应返回值,而应引发异常以指示失败。这种方法的问题在于,控制器不具有是否可以将错误消息返回给客户端的上下文。我也许可以从服务层抛出ClientFacingError异常,控制器可以使用该异常来确定是否可以将错误消息返回给客户端,但是感觉就像我正在将服务层耦合到基础结构层。] >

我有一个非常简单的express js服务器,该服务器接受来自客户端的请求,执行一些业务逻辑并响应该客户端。请求-响应管道由控制器处理,并且...

回答如下:

您有很好的担忧和好的方法,让我补充一些想法:

Node.JS服务层设计

我有一个非常简单的express js服务器,该服务器接受来自客户端的请求,执行一些业务逻辑并响应该客户端。请求-响应管道由控制器处理,业务逻辑在服务层内部执行。该代码可以正常工作,但是我不确定从服务层向控制器返回错误的方式是否正确。

控制器看起来像这样:

async createAnOrder(req, res, next) {
    try {

        // Input validations
        if (!req.body.name){
            throw new ClientFacingError(ERROR_CODES.BAD_REQUEST, "Name is missing")
        }

        let newOrder = new Order();
        let validationDictionary = new ValidationDictionary();

        if (!await orderService.createOrder(newOrder, validationDictionary)){
            return next(new ClientFacingError(ERROR_CODES.BAD_REQUEST, validationDictionary.getErrorMessage()));
        }

        res.json({
            orderId: newOrder.id
        })

    } catch (err) {
        if (err instanceof ClientFacingError) {
            res.status(err.code).json({ message: err.message })
        } else {
            res.status(500).json({ message: "Internal Error" })
        }
    }
}

orderService看起来像这样:

async createOrder(newOrder, validationDictionary) {

    // Business logic validation
    if (await orderDb.hasOrder(newOrder)) {
        validationDictionary.addError("Invalid Order", "Order already exists");
        return false;
    }

    await orderDb.createOrder(newOrder);
    return true;
}

我试图将业务层与其他所有层之间的关注点分离。我还希望在服务层方法和控制器之间建立智能合约。

我认为我想做的是:

  1. 输入验证发生在控制器(基础结构)层,而与业务相关的验证仅发生在服务层
  2. 如果操作成功,服务层方法将返回true,如果存在业务验证错误,则将返回false。
  3. 服务层方法抛出的任何错误都是运行时错误,这些错误由控制器捕获并作为内部错误返回给客户端。

另一种方法是遵守CQS原则。服务层方法不应返回值,而应引发异常以指示失败。这种方法的问题在于,控制器不具有是否可以将错误消息返回给客户端的上下文。我也许可以从服务层抛出ClientFacingError异常,控制器可以使用该异常来确定是否可以将错误消息返回给客户端,但是感觉就像我正在将服务层耦合到基础结构层。] >

我有一个非常简单的express js服务器,该服务器接受来自客户端的请求,执行一些业务逻辑并响应该客户端。请求-响应管道由控制器处理,并且...

回答如下:

您有很好的担忧和好的方法,让我补充一些想法:

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论