Skip to content

Commit 3b2da1d

Browse files
flovilmartTylerBrock
authored andcommitted
Cloud code logs (#2370)
* Adds logging (info/error) when running cloudCode triggers * Adds logs for cloud-function calls - Match parse.com original logging
1 parent 93b4117 commit 3b2da1d

File tree

4 files changed

+72
-9
lines changed

4 files changed

+72
-9
lines changed

spec/CloudCodeLogger.spec.js

+15-6
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,14 @@ describe("Cloud Code Logger", () => {
1616
return logController.getLogs({from: Date.now() - 500, size: 1000});
1717
}).then((res) => {
1818
expect(res.length).not.toBe(0);
19-
let lastLogs = res.slice(0, 2);
20-
let errorMessage = lastLogs[0];
21-
let infoMessage = lastLogs[1];
19+
let lastLogs = res.slice(0, 3);
20+
let cloudFunctionMessage = lastLogs[0];
21+
let errorMessage = lastLogs[1];
22+
let infoMessage = lastLogs[2];
23+
expect(cloudFunctionMessage.level).toBe('info');
24+
expect(cloudFunctionMessage.params).toEqual({});
25+
expect(cloudFunctionMessage.message).toEqual('Ran cloud function loggerTest with:\nInput: {}\nResult: {}');
26+
expect(cloudFunctionMessage.functionName).toEqual('loggerTest');
2227
expect(errorMessage.level).toBe('error');
2328
expect(errorMessage.error).toBe('there was an error');
2429
expect(errorMessage.message).toBe('logTest error log');
@@ -43,9 +48,13 @@ describe("Cloud Code Logger", () => {
4348
return logController.getLogs({from: Date.now() - 500, size: 1000})
4449
}).then((res) => {
4550
expect(res.length).not.toBe(0);
46-
let lastLogs = res.slice(0, 2);
47-
let errorMessage = lastLogs[0];
48-
let infoMessage = lastLogs[1];
51+
let lastLogs = res.slice(0, 3);
52+
let cloudTriggerMessage = lastLogs[0];
53+
let errorMessage = lastLogs[1];
54+
let infoMessage = lastLogs[2];
55+
expect(cloudTriggerMessage.level).toBe('info');
56+
expect(cloudTriggerMessage.input).toEqual({});
57+
expect(cloudTriggerMessage.message).toEqual('beforeSave triggered for MyObject\nInput: {}\nResult: {}');
4958
expect(errorMessage.level).toBe('error');
5059
expect(errorMessage.error).toBe('there was an error');
5160
expect(errorMessage.message).toBe('beforeSave MyObject error log');

src/Routers/FunctionsRouter.js

+16-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ var express = require('express'),
66

77
import PromiseRouter from '../PromiseRouter';
88
import _ from 'lodash';
9+
import { logger } from '../logger';
910

1011
function parseObject(obj) {
1112
if (Array.isArray(obj)) {
@@ -76,7 +77,21 @@ export class FunctionsRouter extends PromiseRouter {
7677
}
7778

7879
return new Promise(function (resolve, reject) {
79-
var response = FunctionsRouter.createResponseObject(resolve, reject);
80+
var response = FunctionsRouter.createResponseObject((result) => {
81+
logger.info(`Ran cloud function ${req.params.functionName} with:\nInput: ${JSON.stringify(params)}\nResult: ${JSON.stringify(result.response.result)}`, {
82+
functionName: req.params.functionName,
83+
params,
84+
result: result.response.resut
85+
});
86+
resolve(result);
87+
}, (error) => {
88+
logger.error(`Failed running cloud function ${req.params.functionName} with:\nInput: ${JSON.stringify(params)}\Error: ${JSON.stringify(error)}`, {
89+
functionName: req.params.functionName,
90+
params,
91+
error
92+
});
93+
reject(error);
94+
});
8095
// Force the keys before the function calls.
8196
Parse.applicationId = req.config.applicationId;
8297
Parse.javascriptKey = req.config.javascriptKey;

src/rest.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ function del(config, auth, className, objectId, clientSDK) {
9494
// Returns a promise for a {response, status, location} object.
9595
function create(config, auth, className, restObject, clientSDK) {
9696
enforceRoleSecurity('create', className, auth);
97-
var write = new RestWrite(config, auth, className, null, restObject, clientSDK);
97+
var write = new RestWrite(config, auth, className, null, restObject, null, clientSDK);
9898
return write.execute();
9999
}
100100

src/triggers.js

+40-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// triggers.js
22
import Parse from 'parse/node';
33
import AppCache from './cache';
4+
import { logger } from './logger';
45

56
export const Types = {
67
beforeSave: 'beforeSave',
@@ -152,6 +153,36 @@ export function getResponseObject(request, resolve, reject) {
152153
}
153154
};
154155

156+
function logTrigger(triggerType, className, input) {
157+
if (triggerType.indexOf('after') != 0) {
158+
return;
159+
}
160+
logger.info(`${triggerType} triggered for ${className}\nInput: ${JSON.stringify(input)}`, {
161+
className,
162+
triggerType,
163+
input
164+
});
165+
}
166+
167+
function logTriggerSuccess(triggerType, className, input, result) {
168+
logger.info(`${triggerType} triggered for ${className}\nInput: ${JSON.stringify(input)}\nResult: ${JSON.stringify(result)}`, {
169+
className,
170+
triggerType,
171+
input,
172+
result
173+
});
174+
}
175+
176+
function logTriggerError(triggerType, className, input, error) {
177+
logger.error(`${triggerType} failed for ${className}\nInput: ${JSON.stringify(input)}\Error: ${JSON.stringify(error)}`, {
178+
className,
179+
triggerType,
180+
input,
181+
error
182+
});
183+
}
184+
185+
155186
// To be used as part of the promise chain when saving/deleting an object
156187
// Will resolve successfully if no trigger is configured
157188
// Resolves to an object, empty or containing an object key. A beforeSave
@@ -165,11 +196,19 @@ export function maybeRunTrigger(triggerType, auth, parseObject, originalParseObj
165196
var trigger = getTrigger(parseObject.className, triggerType, config.applicationId);
166197
if (!trigger) return resolve();
167198
var request = getRequestObject(triggerType, auth, parseObject, originalParseObject, config);
168-
var response = getResponseObject(request, resolve, reject);
199+
var response = getResponseObject(request, (object) => {
200+
logTriggerSuccess(triggerType, parseObject.className, parseObject.toJSON(), object);
201+
resolve(object);
202+
}, (error) => {
203+
logTriggerError(triggerType, parseObject.className, parseObject.toJSON(), error);
204+
reject(error);
205+
});
169206
// Force the current Parse app before the trigger
170207
Parse.applicationId = config.applicationId;
171208
Parse.javascriptKey = config.javascriptKey || '';
172209
Parse.masterKey = config.masterKey;
210+
// For the afterSuccess / afterDelete
211+
logTrigger(triggerType, parseObject.className, parseObject.toJSON());
173212
trigger(request, response);
174213
});
175214
};

0 commit comments

Comments
 (0)