mirror of
https://github.com/zadam/trilium.git
synced 2025-03-02 10:05:34 +08:00
fixed leaking entities into the responses and thus increased performance of e.g. create/duplicate note
This commit is contained in:
parent
df8706026e
commit
711af02928
3 changed files with 49 additions and 13 deletions
|
@ -156,6 +156,10 @@ if (utils.isElectron()) {
|
|||
}
|
||||
|
||||
if (arg.statusCode >= 200 && arg.statusCode < 300) {
|
||||
if (arg.headers['Content-Type'] === 'application/json') {
|
||||
arg.body = JSON.parse(arg.body);
|
||||
}
|
||||
|
||||
reqResolves[arg.requestId]({
|
||||
body: arg.body,
|
||||
headers: arg.headers
|
||||
|
|
|
@ -57,9 +57,8 @@ const csrfMiddleware = csurf({
|
|||
path: '' // nothing so cookie is valid only for current path
|
||||
});
|
||||
|
||||
function apiResultHandler(req, res, result) {
|
||||
res.setHeader('trilium-max-entity-change-id', entityChangesService.getMaxEntityChangeId());
|
||||
|
||||
/** Handling common patterns. If entity is not caught, serialization to JSON will fail */
|
||||
function convertEntitiesToPojo(result) {
|
||||
if (result instanceof AbstractEntity) {
|
||||
result = result.getPojo();
|
||||
}
|
||||
|
@ -70,22 +69,55 @@ function apiResultHandler(req, res, result) {
|
|||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (result && result.note instanceof AbstractEntity) {
|
||||
result.note = result.note.getPojo();
|
||||
}
|
||||
|
||||
if (result && result.branch instanceof AbstractEntity) {
|
||||
result.branch = result.branch.getPojo();
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
function apiResultHandler(req, res, result) {
|
||||
res.setHeader('trilium-max-entity-change-id', entityChangesService.getMaxEntityChangeId());
|
||||
|
||||
result = convertEntitiesToPojo(result);
|
||||
|
||||
// if it's an array and first element is integer then we consider this to be [statusCode, response] format
|
||||
if (Array.isArray(result) && result.length > 0 && Number.isInteger(result[0])) {
|
||||
const [statusCode, response] = result;
|
||||
|
||||
res.status(statusCode).send(response);
|
||||
|
||||
if (statusCode !== 200 && statusCode !== 201 && statusCode !== 204) {
|
||||
log.info(`${req.method} ${req.originalUrl} returned ${statusCode} with response ${JSON.stringify(response)}`);
|
||||
}
|
||||
|
||||
return send(res, statusCode, response);
|
||||
}
|
||||
else if (result === undefined) {
|
||||
res.status(204).send();
|
||||
return send(res, 204, "");
|
||||
}
|
||||
else {
|
||||
res.send(result);
|
||||
return send(res, 200, result);
|
||||
}
|
||||
}
|
||||
|
||||
function send(res, statusCode, response) {
|
||||
if (typeof response === 'string') {
|
||||
res.status(statusCode, response);
|
||||
|
||||
return response.length;
|
||||
}
|
||||
else {
|
||||
const json = JSON.stringify(response);
|
||||
|
||||
res.setHeader("Content-Type", "application/json");
|
||||
res.status(statusCode).send(json);
|
||||
|
||||
return json.length;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -115,9 +147,9 @@ function route(method, path, middleware, routeHandler, resultHandler, transactio
|
|||
if (result && result.then) {
|
||||
result
|
||||
.then(actualResult => {
|
||||
resultHandler(req, res, actualResult);
|
||||
const responseLength = resultHandler(req, res, actualResult);
|
||||
|
||||
log.request(req, res, Date.now() - start);
|
||||
log.request(req, res, Date.now() - start, responseLength);
|
||||
})
|
||||
.catch(e => {
|
||||
log.error(`${method} ${path} threw exception: ` + e.stack);
|
||||
|
@ -126,9 +158,9 @@ function route(method, path, middleware, routeHandler, resultHandler, transactio
|
|||
});
|
||||
}
|
||||
else {
|
||||
resultHandler(req, res, result);
|
||||
const responseLength = resultHandler(req, res, result);
|
||||
|
||||
log.request(req, res, Date.now() - start);
|
||||
log.request(req, res, Date.now() - start, responseLength);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -68,7 +68,7 @@ function error(message) {
|
|||
|
||||
const requestBlacklist = [ "/libraries", "/app", "/images", "/stylesheets" ];
|
||||
|
||||
function request(req, res, timeMs) {
|
||||
function request(req, res, timeMs, responseLength = "?") {
|
||||
for (const bl of requestBlacklist) {
|
||||
if (req.url.startsWith(bl)) {
|
||||
return;
|
||||
|
@ -80,7 +80,7 @@ function request(req, res, timeMs) {
|
|||
}
|
||||
|
||||
info((timeMs >= 10 ? "Slow " : "") +
|
||||
res.statusCode + " " + req.method + " " + req.url + " took " + timeMs + "ms");
|
||||
`${res.statusCode} ${req.method} ${req.url} with ${responseLength} bytes took ${timeMs}ms`);
|
||||
}
|
||||
|
||||
function pad(num) {
|
||||
|
|
Loading…
Reference in a new issue