0

我想创建一个拦截器,它从传入请求中获取数据并向底层数据库发出自定义查询,将该查询的结果返回给用户。我无法弄清楚如何将自定义查询的结果返回给用户。

这是我尝试的示例,但我在插件中创建和设置的响应文档没有返回给用户。

是否可以使用 MongoInterceptor 来做到这一点?

@RegisterPlugin(name = "exampleInterceptor",
        description = "example interceptor",
        interceptPoint = InterceptPoint.REQUEST_AFTER_AUTH,
        priority = 100)
public class ExampleInterceptor implements MongoInterceptor {

    @Override
    public void handle(MongoRequest request, MongoResponse response)
            throws Exception
    {
        String dbName = request.getDBName();
        String collName = request.getCollectionName();
        String[] pathInfo = request.getMappedRequestUri().split("/");
        if (pathInfo.length == 3) {
            String id = pathInfo[2];
            BsonDocument doc = new BsonDocument();
            doc.put("db", new BsonString(dbName));
            doc.put("collection", new BsonString(collName));
            doc.put("id", new BsonString(id));
            response.setContent(doc);
        }
    }

    @Override
    public boolean resolve(MongoRequest request, MongoResponse response) {
        return true;
    }
}

4

1 回答 1

1

为了修改响应,您需要interceptPoint = InterceptPoint.RESPONSE否则响应内容将被 MongoService 覆盖

还要注意响应内容可以是null(对于写请求)、一个对象(对于GET /coll/docid)或者是一个数组(对于GET /coll),所以需要处理不同的情况

尝试以下操作:

@RegisterPlugin(name = "exampleInterceptor",
        description = "example interceptor",
        interceptPoint = InterceptPoint.RESPONSE, // <--- intercept the response
        priority = 100)
public class ExampleInterceptor implements MongoInterceptor {

    @Override
    public void handle(MongoRequest request, MongoResponse response)
    {
        String dbName = request.getDBName() == null ? "null" : request.getDBName();
        String collName = request.getCollectionName() == null ? "null": request.getCollectionName();
        BsonValue id = request.getDocumentId() == null ? BsonNull.VALUE : request.getDocumentId();

        BsonDocument responseContent;

        if (response.getContent() == null) { // null for write requests
             responseContent = new BsonDocument();
             response.setContent(responseContent);
        } else if (response.getContent().isDocument()) { // GET /coll/docid -> object
             responseContent = response.getContent().asDocument();
        } else { // GET /coll -> array
             responseContent = new BsonDocument();
             responseContent.put("docs", response.getContent());
             response.setContent(responseContent);
        }

        // add db, collection and id properties to response content
        responseContent.put("db", new BsonString(dbName));
        responseContent.put("collection", new BsonString(collName));
        responseContent.put("id", id);
    }

    @Override
    public boolean resolve(MongoRequest request, MongoResponse response) {
        return true;
    }
}
于 2020-09-30T20:04:59.193 回答