减少快速API路由中的代码重复

时间:2015-07-17 21:18:17

标签: node.js express mongoose

我正在学习快递,目前正在编写API,并且具有以下结构:

app.route('/api/brief/:_id')
  .get(function(req, res, next) {
    // Check if the _id is a valid ObjectId
    if (mongoose.Types.ObjectId.isValid(req.params._id)) {
      // Do something
    }else{
      // Error
    }
  })
  .put(function(req, res, next) {
    // Check if the _id is a valid ObjectId
    if (mongoose.Types.ObjectId.isValid(req.params._id)) {
      // Do something
    }else{
      // Error
    }
  })
  .delete(function(req, res, next) {
    // Check if the _id is a valid ObjectId
    if (mongoose.Types.ObjectId.isValid(req.params._id)) {
      // Do something
    }else{
      // Error
    }
  });

理想情况下,我想避免重复(检查身份证的有效性)。

有没有办法可以构建路线以避免重复?

1 个答案:

答案 0 :(得分:1)

有几种方法可以接近它。有app.all()方法:

app.all("/api/*", function(req, res, next) {

    if (req.params._id) {

        if (mongoose.Types.ObjectId.isValid(req.params._id)) {
            return next();
        }
        else {
            // error handle
        }
    }
    next();
});

就个人而言,我不喜欢全能。我更明确地说:

function validateMongooseId (req, res, next) {

    if ( mongoose.Types.ObjectId.isValid(req.params._id) ) {
        return next();
    }
    else {
        // error handle
    }
}

function handleGet(req, res, next) {}
function handlePost(req, res, next) {}
function handlePut(req, res, next) {}

app.post("/api/brief", handlePost);
app.get("/api/brief/:_id", validateMongooseId, handleGet);
app.put("/api/brief/:_id", validateMongooseId, handlePut);

我把.post()放在那里,以证明为什么我不喜欢这一切。它显然不适用于该端点。您可能有其他适用于它的中间件函数,因此我宁愿在使用它们的端点上明确地使用它们。