better logging and notifications on script errors for easier debugging

This commit is contained in:
azivner 2018-08-17 11:31:42 +02:00
parent 513748836e
commit 145efe67c3
5 changed files with 40 additions and 11 deletions

View File

@ -1,5 +1,6 @@
import ScriptContext from "./script_context.js"; import ScriptContext from "./script_context.js";
import server from "./server.js"; import server from "./server.js";
import infoService from "./info.js";
async function getAndExecuteBundle(noteId, originEntity = null) { async function getAndExecuteBundle(noteId, originEntity = null) {
const bundle = await server.get('script/bundle/' + noteId); const bundle = await server.get('script/bundle/' + noteId);
@ -10,9 +11,14 @@ async function getAndExecuteBundle(noteId, originEntity = null) {
async function executeBundle(bundle, originEntity) { async function executeBundle(bundle, originEntity) {
const apiContext = ScriptContext(bundle.note, bundle.allNotes, originEntity); const apiContext = ScriptContext(bundle.note, bundle.allNotes, originEntity);
try {
return await (function () { return await (function () {
return eval(`const apiContext = this; (async function() { ${bundle.script}\r\n})()`); return eval(`const apiContext = this; (async function() { ${bundle.script}\r\n})()`);
}.call(apiContext)); }.call(apiContext));
}
catch (e) {
infoService.showAndLogError(`Execution of script "${bundle.note.title}" (${bundle.note.noteId}) failed with error: ${e.message}`);
}
} }
async function executeStartupBundles() { async function executeStartupBundles() {

View File

@ -14,6 +14,12 @@ function showMessage(message) {
}); });
} }
function showAndLogError(message, delay = 10000) {
showError(message, delay);
messagingService.logError(message);
}
function showError(message, delay = 10000) { function showError(message, delay = 10000) {
console.log(utils.now(), "error: ", message); console.log(utils.now(), "error: ", message);
@ -36,5 +42,6 @@ function throwError(message) {
export default { export default {
showMessage, showMessage,
showError, showError,
showAndLogError,
throwError throwError
} }

View File

@ -72,8 +72,13 @@ function ScriptApi(startNote, currentNote, originEntity = null) {
originEntityId: originEntity ? originEntity.noteId : null originEntityId: originEntity ? originEntity.noteId : null
}); });
if (ret.success) {
return ret.executionResult; return ret.executionResult;
} }
else {
throw new Error("server error: " + ret.error);
}
}
return { return {
startNote: startNote, startNote: startNote,

View File

@ -5,10 +5,15 @@ const attributeService = require('../../services/attributes');
const repository = require('../../services/repository'); const repository = require('../../services/repository');
async function exec(req) { async function exec(req) {
try {
const result = await scriptService.executeScript(req.body.script, req.body.params, req.body.startNoteId, const result = await scriptService.executeScript(req.body.script, req.body.params, req.body.startNoteId,
req.body.currentNoteId, req.body.originEntityName, req.body.originEntityId); 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) { async function run(req) {

View File

@ -3,6 +3,7 @@ const ScriptContext = require('./script_context');
const repository = require('./repository'); const repository = require('./repository');
const cls = require('./cls'); const cls = require('./cls');
const sourceIdService = require('./source_id'); const sourceIdService = require('./source_id');
const log = require('./log');
async function executeNote(note, originEntity) { async function executeNote(note, originEntity) {
if (!note.isJavaScript()) { if (!note.isJavaScript()) {
@ -25,12 +26,17 @@ async function executeBundle(bundle, startNote, originEntity = null) {
const ctx = new ScriptContext(startNote, bundle.allNotes, originEntity); const ctx = new ScriptContext(startNote, bundle.allNotes, originEntity);
try {
if (await bundle.note.hasLabel('manualTransactionHandling')) { if (await bundle.note.hasLabel('manualTransactionHandling')) {
return await execute(ctx, script, ''); return await execute(ctx, script, '');
} }
else { else {
return await sql.transactional(async () => await execute(ctx, script, '')); 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}`);
}
} }
/** /**