· 6 years ago · Jan 06, 2020, 04:58 PM
1loopback:boot:bootstrapper Lb3AppBooter phase: load complete. +2s
2 loopback:context [application] Resolving binding: lifeCycleObserver.registry +60ms
3 loopback:context:binding Get value for binding lifeCycleObserver.registry +60ms
4 loopback:context:resolver:session Enter binding: { key: 'lifeCycleObserver.registry',
5 scope: 'Singleton',
6 tags: {},
7 isLocked: false,
8 type: 'Class',
9 valueConstructor: 'LifeCycleObserverRegistry' } +2s
10 loopback:context:resolver:session Resolution path: lifeCycleObserver.registry +0ms
11 loopback:context:resolver Instantiating class LifeCycleObserverRegistry +2s
12 loopback:context:resolver Resolving injected arguments for LifeCycleObserverRegistry. +0ms
13 loopback:context:resolver Resolving an injection: { targetName: 'LifeCycleObserverRegistry.constructor[0]',
14 bindingSelector: [Function: lifeCycleObserverFilter],
15 metadata: { decorator: '@inject.view' } } +0ms
16 loopback:context:resolver:session Enter injection: { targetName: 'LifeCycleObserverRegistry.constructor[0]',
17 bindingSelector: [Function: lifeCycleObserverFilter],
18 metadata: { decorator: '@inject.view' } } +0ms
19 loopback:context:resolver:session Resolution path: lifeCycleObserver.registry --> @LifeCycleObserverRegistry.constructor[0] +0ms
20 loopback:context:view Start listening on changes of context application +0ms
21 loopback:context:resolver:session Exit injection: { targetName: 'LifeCycleObserverRegistry.constructor[0]',
22 bindingSelector: [Function: lifeCycleObserverFilter],
23 metadata: { decorator: '@inject.view' } } +1ms
24 loopback:context:resolver:session Resolution path: lifeCycleObserver.registry +0ms
25 loopback:context:resolver Resolving an injection: { targetName: 'LifeCycleObserverRegistry.constructor[1]',
26 bindingSelector:
27 BindingKey { key: 'lifeCycleObserver.options', propertyPath: undefined },
28 metadata: { decorator: '@inject', optional: true } } +1ms
29 loopback:context:resolver:session Enter injection: { targetName: 'LifeCycleObserverRegistry.constructor[1]',
30 bindingSelector:
31 BindingKey { key: 'lifeCycleObserver.options', propertyPath: undefined },
32 metadata: { decorator: '@inject', optional: true } } +1ms
33 loopback:context:resolver:session Resolution path: lifeCycleObserver.registry --> @LifeCycleObserverRegistry.constructor[1] +0ms
34 loopback:context:resolver:session Exit injection: { targetName: 'LifeCycleObserverRegistry.constructor[1]',
35 bindingSelector:
36 BindingKey { key: 'lifeCycleObserver.options', propertyPath: undefined },
37 metadata: { decorator: '@inject', optional: true } } +0ms
38 loopback:context:resolver:session Resolution path: lifeCycleObserver.registry +0ms
39 loopback:context:resolver Resolving injected properties for class LifeCycleObserverRegistry +1ms
40 loopback:context:resolver Injected arguments for LifeCycleObserverRegistry(): [ ContextView {
41 domain: null,
42 _events: {},
43 _eventsCount: 0,
44 _maxListeners: undefined,
45 context: { name: 'application', bindings: [Object] },
46 filter: [Function: lifeCycleObserverFilter],
47 comparator: undefined,
48 _subscription:
49 ContextSubscription { context: [Object], observer: [Circular], _closed: false } },
50 undefined ] +0ms
51 loopback:context:resolver Injected properties for LifeCycleObserverRegistry: {} +0ms
52 loopback:context:resolver:session Exit binding: { key: 'lifeCycleObserver.registry',
53 scope: 'Singleton',
54 tags: {},
55 isLocked: false,
56 type: 'Class',
57 valueConstructor: 'LifeCycleObserverRegistry' } +1ms
58 loopback:context:resolver:session Resolution path: <empty> +0ms
59 loopback:core:lifecycle Starting the +0ms...
60 loopback:context:view Reading bindings +3ms
61 loopback:context:view Finding matching bindings +0ms
62 loopback:core:lifecycle Binding servers.RestServer is configured with observer group server +0ms
63 loopback:core:lifecycle Binding datasources.db is configured with observer group datasource +0ms
64 loopback:core:lifecycle Observer groups: [{"group":"server","bindings":["servers.RestServer"]},{"group":"datasource","bindings":["datasources.db"]}] +0ms
65 loopback:context:view Reading values +1ms
66 loopback:context:view Resolving values +1ms
67 loopback:context:view Reading bindings +0ms
68 loopback:context:binding Get value for binding servers.RestServer +6ms
69 loopback:context:binding Get value for binding datasources.db +0ms
70 loopback:context:resolver:session Enter binding: { key: 'datasources.db',
71 scope: 'Singleton',
72 tags:
73 { lifeCycleObserver: 'lifeCycleObserver',
74 lifeCycleObserverGroup: 'datasource',
75 name: 'db',
76 type: 'datasource',
77 datasource: 'datasource' },
78 isLocked: false,
79 type: 'Class',
80 valueConstructor: 'DbDataSource' } +2ms
81 loopback:context:resolver:session Resolution path: datasources.db +0ms
82 loopback:context:resolver Instantiating class DbDataSource +3ms
83 loopback:context:resolver Resolving injected arguments for DbDataSource. +0ms
84 loopback:context:resolver Resolving an injection: { targetName: 'DbDataSource.constructor[0]',
85 bindingSelector: 'datasources.config.db',
86 metadata: { decorator: '@inject', optional: true } } +0ms
87 loopback:context:resolver:session Enter injection: { targetName: 'DbDataSource.constructor[0]',
88 bindingSelector: 'datasources.config.db',
89 metadata: { decorator: '@inject', optional: true } } +0ms
90 loopback:context:resolver:session Resolution path: datasources.db --> @DbDataSource.constructor[0] +0ms
91 loopback:context:resolver:session Exit injection: { targetName: 'DbDataSource.constructor[0]',
92 bindingSelector: 'datasources.config.db',
93 metadata: { decorator: '@inject', optional: true } } +0ms
94 loopback:context:resolver:session Resolution path: datasources.db +0ms
95 loopback:context:resolver Resolving injected properties for class DbDataSource +1ms
96 loopback:context:resolver Injected arguments for DbDataSource(): [ undefined ] +0ms
97 loopback:datasource Settings: {"name":"db","connector":"mongodb","url":"mongodb://localhost:27017/hg-api","host":"","port":0,"user":"","password":"","database":"","useNewUrlParser":true,"default":{"name":"db","connector":"mongodb","url":"mongodb://localhost:27017/hg-api","host":"","port":0,"user":"","password":"","database":"","useNewUrlParser":true},"debug":true} +0ms
98 loopback:datasource Module ./connectors/mongodb not found, will try another candidate. +0ms
99 loopback:datasource Initializing connector undefined +1ms
100 loopback:connector:mongodb Settings: {"name":"db","connector":"mongodb","url":"mongodb://localhost:27017/hg-api","host":"","port":0,"user":"","password":"","database":"","useNewUrlParser":true,"default":{"name":"db","connector":"mongodb","url":"mongodb://localhost:27017/hg-api","host":"","port":0,"user":"","password":"","database":"","useNewUrlParser":true},"debug":true,"safe":true,"w":1,"useUnifiedTopology":true} +1s
101 loopback:connector:mongodb Valid options: {"user":"","password":"","useNewUrlParser":true,"w":1,"useUnifiedTopology":true} +0ms
102 loopback:context:resolver Injected properties for DbDataSource: {} +10ms
103 loopback:context:resolver:session Exit binding: { key: 'datasources.db',
104 scope: 'Singleton',
105 tags:
106 { lifeCycleObserver: 'lifeCycleObserver',
107 lifeCycleObserverGroup: 'datasource',
108 name: 'db',
109 type: 'datasource',
110 datasource: 'datasource' },
111 isLocked: false,
112 type: 'Class',
113 valueConstructor: 'DbDataSource' } +11ms
114 loopback:context:resolver:session Resolution path: <empty> +0ms
115 loopback:context:view Reading bindings +11ms
116 loopback:core:lifecycle Beginning notification start of +13ms...
117 loopback:core:lifecycle Invoking start observer for binding servers.RestServer +1ms
118 loopback:context [2785df90-3085-11ea-9692-1b1333a156ac] Resolving binding synchronously: rest.router +18ms
119 loopback:openapi3:metadata:controller-spec Retrieving OpenAPI specification for controller PingController +0ms
120 loopback:openapi3:metadata:controller-spec processing method ping +1ms
121 loopback:openapi3:metadata:controller-spec operation for method ping: {"verb":"get","path":"/ping","spec":{"responses":{"200":{"description":"Ping Response","content":{"application/json":{"schema":{"type":"object","properties":{"greeting":{"type":"string"},"date":{"type":"string"},"url":{"type":"string"},"headers":{"type":"object","properties":{"Content-Type":{"type":"string"}},"additionalProperties":false}}}}}}}}} +0ms
122 loopback:openapi3:metadata:controller-spec spec responses for method ping: { '200': { description: 'Ping Response', content: { 'application/json': [Object] } } } +0ms
123 loopback:openapi3:metadata:controller-spec processing response code 200 with content-type % application/json +0ms
124 loopback:openapi3:metadata:controller-spec processing extensions in schema: {"type":"object","properties":{"greeting":{"type":"string"},"date":{"type":"string"},"url":{"type":"string"},"headers":{"type":"object","properties":{"Content-Type":{"type":"string"}},"additionalProperties":false}}} +18ms
125 loopback:openapi3:metadata:controller-spec x-ts-type => undefined +0ms
126 loopback:openapi3:metadata:controller-spec processing extensions in schema: {"type":"string"} +0ms
127 loopback:openapi3:metadata:controller-spec x-ts-type => undefined +0ms
128 loopback:openapi3:metadata:controller-spec processing extensions in schema: {"type":"string"} +0ms
129 loopback:openapi3:metadata:controller-spec x-ts-type => undefined +0ms
130 loopback:openapi3:metadata:controller-spec processing extensions in schema: {"type":"string"} +0ms
131 loopback:openapi3:metadata:controller-spec x-ts-type => undefined +0ms
132 loopback:openapi3:metadata:controller-spec processing extensions in schema: {"type":"object","properties":{"Content-Type":{"type":"string"}},"additionalProperties":false} +0ms
133 loopback:openapi3:metadata:controller-spec x-ts-type => undefined +0ms
134 loopback:openapi3:metadata:controller-spec processing extensions in schema: {"type":"string"} +0ms
135 loopback:openapi3:metadata:controller-spec x-ts-type => undefined +0ms
136 loopback:openapi3:metadata:controller-spec processing parameters for method ping +0ms
137 loopback:openapi3:metadata:controller-spec parameters for method ping: undefined +0ms
138 loopback:openapi3:metadata:controller-spec processing requestBody for method ping +0ms
139 loopback:openapi3:metadata:controller-spec adding PingController.ping (get /ping) { responses:
140 { '200': { description: 'Ping Response', content: [Object] } },
141 'x-operation-name': 'ping',
142 'x-controller-name': 'PingController',
143 operationId: 'PingController.ping' } +0ms
144 loopback:openapi3:metadata:controller-spec inferring schema object for method ping +0ms
145 loopback:rest:server Registering controller PingController +0ms
146 loopback:rest:routing-table Registering Controller with API { paths:
147 { '/ping':
148 { get:
149 { responses:
150 { '200':
151 { description: 'Ping Response',
152 content:
153 { 'application/json':
154 { schema:
155 { type: 'object',
156 properties:
157 { greeting: { type: 'string' },
158 date: { type: 'string' },
159 url: { type: 'string' },
160 headers:
161 { type: 'object',
162 properties: { 'Content-Type': { type: 'string' } },
163 additionalProperties: false } } } } } } },
164 'x-operation-name': 'ping',
165 'x-controller-name': 'PingController',
166 operationId: 'PingController.ping' } } } } +0ms
167 loopback:rest:routing-table Registering route GET /ping -> PingController.ping() +0ms
168 loopback:openapi3:metadata:controller-spec Retrieving OpenAPI specification for controller SocketIOController +2ms
169 loopback:rest:server Registering controller SocketIOController +2ms
170 loopback:openapi3:metadata:controller-spec Retrieving OpenAPI specification for controller NewUserRequest +0ms
171 loopback:rest:server Registering controller NewUserRequest +0ms
172 loopback:openapi3:metadata:controller-spec Retrieving OpenAPI specification for controller UserController +0ms
173 loopback:openapi3:metadata:controller-spec processing method create +1ms
174 loopback:openapi3:metadata:controller-spec operation for method create: {"verb":"post","path":"/users","spec":{"responses":{"200":{"description":"User","content":{"application/json":{"schema":{}}}}}}} +0ms
175 loopback:openapi3:metadata:controller-spec spec responses for method create: { '200': { description: 'User', content: { 'application/json': [Object] } } } +0ms
176 loopback:openapi3:metadata:controller-spec processing response code 200 with content-type % application/json +0ms
177 loopback:openapi3:metadata:controller-spec processing extensions in schema: {} +0ms
178 loopback:openapi3:metadata:controller-spec x-ts-type => { [Function: User] definition: ModelDefinition { name: 'User', properties: { id: [Object], email: [Object], firstName: [Object], lastName: [Object] }, settings: { indexes: [Object] }, relations: { userCredentials: [Object] } } } +0ms
179 loopback:repository-json-schema:build-schema Creating schema for model User +2s
180 loopback:repository-json-schema:build-schema JSON schema options: { visited: {}, optional: [] } +1ms
181 loopback:repository-json-schema:build-schema Model settings { indexes: { uniqueEmail: { keys: [Object], options: [Object] } } } +0ms
182 loopback:repository-json-schema:build-schema additionalProperties? false +0ms
183 loopback:openapi3:metadata:controller-spec defining schema for "User": {"title":"User","properties":{"id":{"type":"string"},"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"}},"required":["email"],"additionalProperties":false} +1ms
184 loopback:openapi3:metadata:controller-spec processing parameters for method create +0ms
185 loopback:openapi3:metadata:controller-spec parameters for method create: undefined +0ms
186 loopback:openapi3:metadata:controller-spec processing requestBody for method create +0ms
187 loopback:openapi3:metadata:controller-spec requestBody for method create: {"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewUser","definitions":{"NewUser":{"title":"NewUser","description":"(Schema options: { title: 'NewUser' })","properties":{"id":{"type":"string"},"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"password":{"type":"string"}},"required":["email","password"],"additionalProperties":false}}}}}} +0ms
188 loopback:openapi3:metadata:controller-spec processing extensions in schema: {"$ref":"#/components/schemas/NewUser","definitions":{"NewUser":{"title":"NewUser","description":"(Schema options: { title: 'NewUser' })","properties":{"id":{"type":"string"},"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"password":{"type":"string"}},"required":["email","password"],"additionalProperties":false}}} +0ms
189 loopback:openapi3:metadata:controller-spec assigning related schemas: [ 'NewUser' ] +0ms
190 loopback:openapi3:metadata:controller-spec defining referenced schema for "NewUser": {"title":"NewUser","description":"(Schema options: { title: 'NewUser' })","properties":{"id":{"type":"string"},"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"password":{"type":"string"}},"required":["email","password"],"additionalProperties":false} +0ms
191 loopback:openapi3:metadata:controller-spec adding UserController.create (post /users) { responses: { '200': { description: 'User', content: [Object] } },
192 requestBody: { content: { 'application/json': [Object] } },
193 'x-operation-name': 'create',
194 'x-controller-name': 'UserController',
195 operationId: 'UserController.create' } +0ms
196 loopback:openapi3:metadata:controller-spec inferring schema object for method create +0ms
197 loopback:repository-json-schema:build-schema Creating schema for model NewUserRequest +1ms
198 loopback:repository-json-schema:build-schema JSON schema options: { visited: {}, optional: [] } +0ms
199 loopback:repository-json-schema:build-schema Model settings { indexes: { uniqueEmail: { keys: [Object], options: [Object] } } } +0ms
200 loopback:repository-json-schema:build-schema additionalProperties? false +0ms
201 loopback:openapi3:metadata:controller-spec defining schema for "NewUserRequest": {"title":"NewUserRequest","properties":{"id":{"type":"string"},"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"password":{"type":"string"}},"required":["email","password"],"additionalProperties":false} +1ms
202 loopback:openapi3:metadata:controller-spec processing method findById +0ms
203 loopback:openapi3:metadata:controller-spec operation for method findById: {"verb":"get","path":"/users/{userId}","spec":{"responses":{"200":{"description":"User","content":{"application/json":{"schema":{}}}}}}} +0ms
204 loopback:openapi3:metadata:controller-spec spec responses for method findById: { '200': { description: 'User', content: { 'application/json': [Object] } } } +0ms
205 loopback:openapi3:metadata:controller-spec processing response code 200 with content-type % application/json +0ms
206 loopback:openapi3:metadata:controller-spec processing extensions in schema: {} +0ms
207 loopback:openapi3:metadata:controller-spec x-ts-type => { [Function: User] definition: ModelDefinition { name: 'User', properties: { id: [Object], email: [Object], firstName: [Object], lastName: [Object] }, settings: { indexes: [Object] }, relations: { userCredentials: [Object] } } } +0ms
208 loopback:openapi3:metadata:controller-spec skipping type "User" as already defined +0ms
209 loopback:openapi3:metadata:controller-spec processing parameters for method findById +0ms
210 loopback:openapi3:metadata:controller-spec parameters for method findById: [{"name":"userId","in":"path","schema":{"type":"string"}}] +1ms
211 loopback:openapi3:metadata:controller-spec processing requestBody for method findById +0ms
212 loopback:openapi3:metadata:controller-spec adding UserController.findById (get /users/{userId}) { responses: { '200': { description: 'User', content: [Object] } },
213 parameters:
214 [ { name: 'userId', in: 'path', schema: [Object], required: true } ],
215 'x-operation-name': 'findById',
216 'x-controller-name': 'UserController',
217 operationId: 'UserController.findById' } +0ms
218 loopback:openapi3:metadata:controller-spec inferring schema object for method findById +0ms
219 loopback:openapi3:metadata:controller-spec processing method printCurrentUser +0ms
220 loopback:openapi3:metadata:controller-spec operation for method printCurrentUser: {"verb":"get","path":"/users/me","spec":{"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The current user profile","content":{"application/json":{"schema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":"string"}}}}}}}}} +0ms
221 loopback:openapi3:metadata:controller-spec spec responses for method printCurrentUser: { '200': { description: 'The current user profile', content: { 'application/json': [Object] } } } +0ms
222 loopback:openapi3:metadata:controller-spec processing response code 200 with content-type % application/json +0ms
223 loopback:openapi3:metadata:controller-spec processing extensions in schema: {"type":"object","required":["id"],"properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":"string"}}} +0ms
224 loopback:openapi3:metadata:controller-spec x-ts-type => undefined +0ms
225 loopback:openapi3:metadata:controller-spec processing extensions in schema: {"type":"string"} +0ms
226 loopback:openapi3:metadata:controller-spec x-ts-type => undefined +0ms
227 loopback:openapi3:metadata:controller-spec processing extensions in schema: {"type":"string"} +0ms
228 loopback:openapi3:metadata:controller-spec x-ts-type => undefined +0ms
229 loopback:openapi3:metadata:controller-spec processing extensions in schema: {"type":"string"} +0ms
230 loopback:openapi3:metadata:controller-spec x-ts-type => undefined +0ms
231 loopback:openapi3:metadata:controller-spec processing parameters for method printCurrentUser +0ms
232 loopback:openapi3:metadata:controller-spec parameters for method printCurrentUser: undefined +0ms
233 loopback:openapi3:metadata:controller-spec processing requestBody for method printCurrentUser +0ms
234 loopback:openapi3:metadata:controller-spec adding UserController.printCurrentUser (get /users/me) { security: [ { bearerAuth: [] } ],
235 responses:
236 { '200':
237 { description: 'The current user profile', content: [Object] } },
238 'x-operation-name': 'printCurrentUser',
239 'x-controller-name': 'UserController',
240 operationId: 'UserController.printCurrentUser' } +0ms
241 loopback:openapi3:metadata:controller-spec inferring schema object for method printCurrentUser +1ms
242 loopback:openapi3:metadata:controller-spec processing method login +0ms
243 loopback:openapi3:metadata:controller-spec operation for method login: {"verb":"post","path":"/users/login","spec":{"responses":{"200":{"description":"Token","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"}}}}}}}}} +0ms
244 loopback:openapi3:metadata:controller-spec spec responses for method login: { '200': { description: 'Token', content: { 'application/json': [Object] } } } +0ms
245 loopback:openapi3:metadata:controller-spec processing response code 200 with content-type % application/json +0ms
246 loopback:openapi3:metadata:controller-spec processing extensions in schema: {"type":"object","properties":{"token":{"type":"string"}}} +0ms
247 loopback:openapi3:metadata:controller-spec x-ts-type => undefined +0ms
248 loopback:openapi3:metadata:controller-spec processing extensions in schema: {"type":"string"} +0ms
249 loopback:openapi3:metadata:controller-spec x-ts-type => undefined +0ms
250 loopback:openapi3:metadata:controller-spec processing parameters for method login +0ms
251 loopback:openapi3:metadata:controller-spec parameters for method login: undefined +0ms
252 loopback:openapi3:metadata:controller-spec processing requestBody for method login +0ms
253 loopback:openapi3:metadata:controller-spec requestBody for method login: {"description":"The input of login function","required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":8}}}}}} +0ms
254 loopback:openapi3:metadata:controller-spec processing extensions in schema: {"type":"object","required":["email","password"],"properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":8}}} +0ms
255 loopback:openapi3:metadata:controller-spec x-ts-type => undefined +0ms
256 loopback:openapi3:metadata:controller-spec processing extensions in schema: {"type":"string","format":"email"} +0ms
257 loopback:openapi3:metadata:controller-spec x-ts-type => undefined +0ms
258 loopback:openapi3:metadata:controller-spec processing extensions in schema: {"type":"string","minLength":8} +0ms
259 loopback:openapi3:metadata:controller-spec x-ts-type => undefined +0ms
260 loopback:openapi3:metadata:controller-spec adding UserController.login (post /users/login) { responses: { '200': { description: 'Token', content: [Object] } },
261 requestBody:
262 { description: 'The input of login function',
263 required: true,
264 content: { 'application/json': [Object] } },
265 'x-operation-name': 'login',
266 'x-controller-name': 'UserController',
267 operationId: 'UserController.login' } +0ms
268 loopback:openapi3:metadata:controller-spec inferring schema object for method login +0ms
269 loopback:rest:server Registering controller UserController +5ms
270 loopback:rest:routing-table Registering Controller with API { paths:
271 { '/users':
272 { post:
273 { responses:
274 { '200':
275 { description: 'User',
276 content:
277 { 'application/json': { schema: { '$ref': '#/components/schemas/User' } } } } },
278 requestBody:
279 { content:
280 { 'application/json': { schema: { '$ref': '#/components/schemas/NewUser' } } } },
281 'x-operation-name': 'create',
282 'x-controller-name': 'UserController',
283 operationId: 'UserController.create' } },
284 '/users/{userId}':
285 { get:
286 { responses:
287 { '200':
288 { description: 'User',
289 content:
290 { 'application/json': { schema: { '$ref': '#/components/schemas/User' } } } } },
291 parameters:
292 [ { name: 'userId',
293 in: 'path',
294 schema: { type: 'string' },
295 required: true } ],
296 'x-operation-name': 'findById',
297 'x-controller-name': 'UserController',
298 operationId: 'UserController.findById' } },
299 '/users/me':
300 { get:
301 { security: [ { bearerAuth: [] } ],
302 responses:
303 { '200':
304 { description: 'The current user profile',
305 content:
306 { 'application/json':
307 { schema:
308 { type: 'object',
309 required: [ 'id' ],
310 properties:
311 { id: { type: 'string' },
312 email: { type: 'string' },
313 name: { type: 'string' } } } } } } },
314 'x-operation-name': 'printCurrentUser',
315 'x-controller-name': 'UserController',
316 operationId: 'UserController.printCurrentUser' } },
317 '/users/login':
318 { post:
319 { responses:
320 { '200':
321 { description: 'Token',
322 content:
323 { 'application/json':
324 { schema:
325 { type: 'object', properties: { token: { type: 'string' } } } } } } },
326 requestBody:
327 { description: 'The input of login function',
328 required: true,
329 content:
330 { 'application/json':
331 { schema:
332 { type: 'object',
333 required: [ 'email', 'password' ],
334 properties:
335 { email: { type: 'string', format: 'email' },
336 password: { type: 'string', minLength: 8 } } } } } },
337 'x-operation-name': 'login',
338 'x-controller-name': 'UserController',
339 operationId: 'UserController.login' } } },
340 components:
341 { schemas:
342 { User:
343 { title: 'User',
344 properties:
345 { id: { type: 'string' },
346 email: { type: 'string' },
347 firstName: { type: 'string' },
348 lastName: { type: 'string' } },
349 required: [ 'email' ],
350 additionalProperties: false },
351 NewUser:
352 { title: 'NewUser',
353 description: '(Schema options: { title: \'NewUser\' })',
354 properties:
355 { id: { type: 'string' },
356 email: { type: 'string' },
357 firstName: { type: 'string' },
358 lastName: { type: 'string' },
359 password: { type: 'string' } },
360 required: [ 'email', 'password' ],
361 additionalProperties: false },
362 NewUserRequest:
363 { title: 'NewUserRequest',
364 properties:
365 { id: { type: 'string' },
366 email: { type: 'string' },
367 firstName: { type: 'string' },
368 lastName: { type: 'string' },
369 password: { type: 'string' } },
370 required: [ 'email', 'password' ],
371 additionalProperties: false } } } } +7ms
372 loopback:rest:routing-table Registering route POST /users -> UserController.create() +0ms
373 loopback:rest:routing-table Registering route GET /users/{userId} -> UserController.findById(userId) +0ms
374 loopback:rest:routing-table Registering route GET /users/me -> UserController.printCurrentUser() +1ms
375 loopback:rest:routing-table Registering route POST /users/login -> UserController.login() +0ms
376 loopback:openapi3:metadata:controller-spec Retrieving OpenAPI specification for controller WebSocketController +2ms
377 loopback:rest:server Registering controller WebSocketController +2ms
378 loopback:context [2785df90-3085-11ea-9692-1b1333a156ac] Resolving binding synchronously: routes.get %2Fexplorer +30ms
379 loopback:context:binding Get value for binding routes.get %2Fexplorer +42ms
380 loopback:context:resolver:session Enter binding: { key: 'routes.get %2Fexplorer',
381 scope: 'Transient',
382 tags: { route: 'route' },
383 isLocked: false,
384 type: 'Constant' } +31ms
385 loopback:context:resolver:session Resolution path: routes.get %2Fexplorer +0ms
386 loopback:context:resolver:session Exit binding: { key: 'routes.get %2Fexplorer',
387 scope: 'Transient',
388 tags: { route: 'route' },
389 isLocked: false,
390 type: 'Constant' } +0ms
391 loopback:context:resolver:session Resolution path: <empty> +0ms
392 loopback:rest:routing-table Registering route GET /explorer -> ExplorerController.indexRedirect() +1ms
393 loopback:context [2785df90-3085-11ea-9692-1b1333a156ac] Resolving binding synchronously: routes.get %2Fexplorer%2F +0ms
394 loopback:context:binding Get value for binding routes.get %2Fexplorer%2F +0ms
395 loopback:context:resolver:session Enter binding: { key: 'routes.get %2Fexplorer%2F',
396 scope: 'Transient',
397 tags: { route: 'route' },
398 isLocked: false,
399 type: 'Constant' } +0ms
400 loopback:context:resolver:session Resolution path: routes.get %2Fexplorer%2F +0ms
401 loopback:context:resolver:session Exit binding: { key: 'routes.get %2Fexplorer%2F',
402 scope: 'Transient',
403 tags: { route: 'route' },
404 isLocked: false,
405 type: 'Constant' } +0ms
406 loopback:context:resolver:session Resolution path: <empty> +0ms
407 loopback:rest:routing-table Registering route GET /explorer/ -> ExplorerController.index() +0ms
408 loopback:context [2785df90-3085-11ea-9692-1b1333a156ac] Resolving binding synchronously: routes.get %2Fexplorer%2Fopenapi%2Ejson +0ms
409 loopback:context:binding Get value for binding routes.get %2Fexplorer%2Fopenapi%2Ejson +0ms
410 loopback:context:resolver:session Enter binding: { key: 'routes.get %2Fexplorer%2Fopenapi%2Ejson',
411 scope: 'Transient',
412 tags: { route: 'route' },
413 isLocked: false,
414 type: 'Constant' } +1ms
415 loopback:context:resolver:session Resolution path: routes.get %2Fexplorer%2Fopenapi%2Ejson +0ms
416 loopback:context:resolver:session Exit binding: { key: 'routes.get %2Fexplorer%2Fopenapi%2Ejson',
417 scope: 'Transient',
418 tags: { route: 'route' },
419 isLocked: false,
420 type: 'Constant' } +0ms
421 loopback:context:resolver:session Resolution path: <empty> +0ms
422 loopback:rest:routing-table Registering route GET /explorer/openapi.json -> ExplorerController.spec() +1ms
423 loopback:context [2785df90-3085-11ea-9692-1b1333a156ac] Resolving binding synchronously: rest.apiSpec +2ms
424 loopback:context:binding Get value for binding rest.apiSpec +2ms
425 loopback:context:resolver:session Enter binding: { key: 'rest.apiSpec',
426 scope: 'Transient',
427 tags: {},
428 isLocked: false,
429 type: 'Constant' } +1ms
430 loopback:context:resolver:session Resolution path: rest.apiSpec +0ms
431 loopback:context:resolver:session Exit binding: { key: 'rest.apiSpec',
432 scope: 'Transient',
433 tags: {},
434 isLocked: false,
435 type: 'Constant' } +0ms
436 loopback:context:resolver:session Resolution path: <empty> +0ms
437 loopback:context [2785df90-3085-11ea-9692-1b1333a156ac] Resolving binding: rest.port +0ms
438 loopback:context:binding Get value for binding rest.port +0ms
439 loopback:context:resolver:session Enter binding: { key: 'rest.port',
440 scope: 'Transient',
441 tags: {},
442 isLocked: false,
443 type: 'Constant' } +0ms
444 loopback:context:resolver:session Resolution path: rest.port +0ms
445 loopback:context:resolver:session Exit binding: { key: 'rest.port',
446 scope: 'Transient',
447 tags: {},
448 isLocked: false,
449 type: 'Constant' } +0ms
450 loopback:context:resolver:session Resolution path: <empty> +0ms
451 loopback:context [2785df90-3085-11ea-9692-1b1333a156ac] Resolving binding: rest.host +0ms
452 loopback:context:binding Get value for binding rest.host +0ms
453 loopback:context:resolver:session Enter binding: { key: 'rest.host',
454 scope: 'Transient',
455 tags: {},
456 isLocked: false,
457 type: 'Constant' } +0ms
458 loopback:context:resolver:session Resolution path: rest.host +0ms
459 loopback:context:resolver:session Exit binding: { key: 'rest.host',
460 scope: 'Transient',
461 tags: {},
462 isLocked: false,
463 type: 'Constant' } +0ms
464 loopback:context:resolver:session Resolution path: <empty> +0ms
465 loopback:context [2785df90-3085-11ea-9692-1b1333a156ac] Resolving binding: rest.path +0ms
466 loopback:context:binding Get value for binding rest.path +0ms
467 loopback:context:resolver:session Enter binding: { key: 'rest.path',
468 scope: 'Transient',
469 tags: {},
470 isLocked: false,
471 type: 'Constant' } +0ms
472 loopback:context:resolver:session Resolution path: rest.path +0ms
473 loopback:context:resolver:session Exit binding: { key: 'rest.path',
474 scope: 'Transient',
475 tags: {},
476 isLocked: false,
477 type: 'Constant' } +0ms
478 loopback:context:resolver:session Resolution path: <empty> +0ms
479 loopback:context [2785df90-3085-11ea-9692-1b1333a156ac] Resolving binding: rest.protocol +0ms
480 loopback:context:binding Get value for binding rest.protocol +0ms
481 loopback:context:resolver:session Enter binding: { key: 'rest.protocol',
482 scope: 'Transient',
483 tags: {},
484 isLocked: false,
485 type: 'Constant' } +0ms
486 loopback:context:resolver:session Resolution path: rest.protocol +0ms
487 loopback:context:resolver:session Exit binding: { key: 'rest.protocol',
488 scope: 'Transient',
489 tags: {},
490 isLocked: false,
491 type: 'Constant' } +0ms
492 loopback:context:resolver:session Resolution path: <empty> +0ms
493 loopback:context [2785df90-3085-11ea-9692-1b1333a156ac] Resolving binding: rest.httpsOptions +0ms
494 loopback:context:binding Get value for binding rest.httpsOptions +0ms
495 loopback:context:resolver:session Enter binding: { key: 'rest.httpsOptions',
496 scope: 'Transient',
497 tags: {},
498 isLocked: false,
499 type: 'Constant' } +1ms
500 loopback:context:resolver:session Resolution path: rest.httpsOptions +0ms
501 loopback:context:resolver:session Exit binding: { key: 'rest.httpsOptions',
502 scope: 'Transient',
503 tags: {},
504 isLocked: false,
505 type: 'Constant' } +0ms
506 loopback:context:resolver:session Resolution path: <empty> +0ms
507 loopback:rest:server RestServer is not listening as listenOnStart flag is set to false. +4ms
508 loopback:core:lifecycle Finished notification start of +33ms
509 loopback:core:lifecycle Beginning notification start of +0ms...
510 loopback:core:lifecycle Invoking start observer for binding datasources.db +0ms
511 loopback:core:lifecycle Finished notification start of +0ms
512 loopback:context [application] Resolving binding synchronously: servers.RestServer +1ms
513 loopback:context:binding Get value for binding servers.RestServer +1ms
514 loopback:context [application] Resolving binding synchronously: servers.RestServer +0ms
515 loopback:context:binding Get value for binding servers.RestServer +0ms
516Server is running at http://127.0.0.1:3000
517 loopback:connector:mongodb MongoDB connection is established: mongodb://localhost:27017/hg-api +60ms