mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 02:16:05 +01:00 
			
		
		
		
	better logging and notifications on script errors for easier debugging
This commit is contained in:
		| @@ -1,5 +1,6 @@ | ||||
| import ScriptContext from "./script_context.js"; | ||||
| import server from "./server.js"; | ||||
| import infoService from "./info.js"; | ||||
|  | ||||
| async function getAndExecuteBundle(noteId, originEntity = null) { | ||||
|     const bundle = await server.get('script/bundle/' + noteId); | ||||
| @@ -10,10 +11,15 @@ async function getAndExecuteBundle(noteId, originEntity = null) { | ||||
| async function executeBundle(bundle, originEntity) { | ||||
|     const apiContext = ScriptContext(bundle.note, bundle.allNotes, originEntity); | ||||
|  | ||||
|     try { | ||||
|         return await (function () { | ||||
|             return eval(`const apiContext = this; (async function() { ${bundle.script}\r\n})()`); | ||||
|         }.call(apiContext)); | ||||
|     } | ||||
|     catch (e) { | ||||
|         infoService.showAndLogError(`Execution of script "${bundle.note.title}" (${bundle.note.noteId}) failed with error: ${e.message}`); | ||||
|     } | ||||
| } | ||||
|  | ||||
| async function executeStartupBundles() { | ||||
|     const scriptBundles = await server.get("script/startup"); | ||||
|   | ||||
| @@ -14,6 +14,12 @@ function showMessage(message) { | ||||
|     }); | ||||
| } | ||||
|  | ||||
| function showAndLogError(message, delay = 10000) { | ||||
|     showError(message, delay); | ||||
|  | ||||
|     messagingService.logError(message); | ||||
| } | ||||
|  | ||||
| function showError(message, delay = 10000) { | ||||
|     console.log(utils.now(), "error: ", message); | ||||
|  | ||||
| @@ -36,5 +42,6 @@ function throwError(message) { | ||||
| export default { | ||||
|     showMessage, | ||||
|     showError, | ||||
|     showAndLogError, | ||||
|     throwError | ||||
| } | ||||
| @@ -72,8 +72,13 @@ function ScriptApi(startNote, currentNote, originEntity = null) { | ||||
|             originEntityId: originEntity ? originEntity.noteId : null | ||||
|         }); | ||||
|  | ||||
|         if (ret.success) { | ||||
|             return ret.executionResult; | ||||
|         } | ||||
|         else { | ||||
|             throw new Error("server error: " + ret.error); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return { | ||||
|         startNote: startNote, | ||||
|   | ||||
| @@ -5,10 +5,15 @@ const attributeService = require('../../services/attributes'); | ||||
| const repository = require('../../services/repository'); | ||||
|  | ||||
| async function exec(req) { | ||||
|     try { | ||||
|         const result = await scriptService.executeScript(req.body.script, req.body.params, req.body.startNoteId, | ||||
|             req.body.currentNoteId, req.body.originEntityName, req.body.originEntityId); | ||||
|  | ||||
|     return { executionResult: result }; | ||||
|         return { success: true, executionResult: result }; | ||||
|     } | ||||
|     catch (e) { | ||||
|         return { success: false, error: e.message }; | ||||
|     } | ||||
| } | ||||
|  | ||||
| async function run(req) { | ||||
|   | ||||
| @@ -3,6 +3,7 @@ const ScriptContext = require('./script_context'); | ||||
| const repository = require('./repository'); | ||||
| const cls = require('./cls'); | ||||
| const sourceIdService = require('./source_id'); | ||||
| const log = require('./log'); | ||||
|  | ||||
| async function executeNote(note, originEntity) { | ||||
|     if (!note.isJavaScript()) { | ||||
| @@ -25,6 +26,7 @@ async function executeBundle(bundle, startNote, originEntity = null) { | ||||
|  | ||||
|     const ctx = new ScriptContext(startNote, bundle.allNotes, originEntity); | ||||
|  | ||||
|     try { | ||||
|         if (await bundle.note.hasLabel('manualTransactionHandling')) { | ||||
|             return await execute(ctx, script, ''); | ||||
|         } | ||||
| @@ -32,6 +34,10 @@ async function executeBundle(bundle, startNote, originEntity = null) { | ||||
|             return await sql.transactional(async () => await execute(ctx, script, '')); | ||||
|         } | ||||
|     } | ||||
|     catch (e) { | ||||
|         log.error(`Execution of script "${bundle.note.title}" (${bundle.note.noteId}) failed with error: ${e.message}`); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * This method preserves frontend startNode - that's why we start execution from currentNote and override | ||||
|   | ||||
		Reference in New Issue
	
	Block a user