Route
Routes are overridden by name and weight, and sorted by priority (desc), then by weight (desc).
class MyRoute {
@route('GET c_340_ping', {
name: 'c_340_get',
weight: 1
})
static get({ req, res, body, next, runtime }) {
return true
}
@route({
weight: 1,
method: 'POST',
name: 'c_340_post',
path: 'c_340_ping',
acl: 'role.administrator'
})
post({ req, res, body, next, runtime }) {
return body('myData')
}
}
@route(options)
Arguments
options
{ Object } Options objectname
{ String }type
{ String }principal
{ String }environment
{ String = "*" }weight
{ Number = 0 }method
{ String }path
{ String }authValidation
{ Object }urlEncoded
{ String }plainText
{ String }apiKey
{ String }priority
{ Number }
@route(routeIdentity, options)
Arguments
routeIdentity
{ String } A string defining the route method using the format"<method> <path>"
options
{ Object } Options objectname
{ String }type
{ String }principal
{ String }environment
{ String = "*" }weight
{ Number = 0 }authValidation
{ Object }urlEncoded
{ String }plainText
{ String }apiKey
{ String }priority
{ Number }
Method Options
methodOptions
{ Object } Options passed to the methodreq
{ Object }res
{ Object }body
{ Object }next
{ Function }runtime
{ Object }name
{ String }type
{ String }principal
{ String }environment
{ String = "*" }weight
{ Number = 0 }configuration
{ Object }method
{ String }path
{ String }authValidation
{ Object }urlEncoded
{ String }plainText
{ String }apiKey
{ String }priority
{ Number }acl
{ String }
metadata
{ Object }resource
{ String }className
{ String }methodName
{ String }static
{ Boolean }loc
{ Object }line
{ String }column
{ String }
body(key, value)
Accessor for the script API's body
key
{ string } Key associated to a useful valuevalue
{ Object | number | string | boolean = undefined } If defined, will create an association between the key and value
Example
const data = body('myData')
next(err)
Calls the API route's next method.
script.api.route.next(err)
err
{ Object = null } Error object
Route Layering
class Ping extends CortexObject {
// run first no api key set, will use that of the caller.
@log({ traceError: true })
@route('* *', { priority: 999 })
static count({ req, res, next, runtime }) {
try {
res.setHeader('Content-Type', 'application/x-ndjson')
} catch(err) {}
res.write(JSON.stringify({
route: `${runtime.configuration.method} /routes/${runtime.configuration.path}`,
key: req.client.key,
principal: script.principal.email,
resource: runtime.metadata.resource
})+'\n')
next()
}
// run second, but only if pingCount is 1. pins the app to c_dashboard
@log({ traceError: true })
@route('POST pingCount/1', {
apiKey: 'c_dashboard',
priority: 2
})
static countAgain({ req, res, next, runtime }) {
try {
res.setHeader('Content-Type', 'application/x-ndjson')
} catch(err) {}
res.write(JSON.stringify({
route: `${runtime.configuration.method} /routes/${runtime.configuration.path}`,
key: req.client.key,
principal: script.principal.email,
resource: runtime.metadata.resource
})+'\n')
next()
}
// run last
@log({ traceError: true })
@route('POST pingCount/:num', { priority: 1 })
static countOnceMore({ req, res, runtime }) {
try {
res.setHeader('Content-Type', 'application/x-ndjson')
} catch(err) {}
res.write(JSON.stringify({
route: `${runtime.configuration.method} /routes/${runtime.configuration.path}`,
key: req.client.key,
principal: script.principal.email,
resource: runtime.metadata.resource
})+'\n')
}
}
Result
$> mdctl api POST /routes/pingCount --ndjson
{"route":"* /routes/*","key":"MedableWebAppClientKey","principal":"[email protected]","resource":"script#type(library).name(c_ping_library).runtime.@route 57:2"}
{"route":"post /routes/pingCount/1","key":"kw30gTF8kXDIiPJYemlDBj","principal":"[email protected]","resource":"script#type(library).name(c_ping_library).runtime.@route 71:2"}
{"route":"post /routes/pingCount/:num","key":"kw30gTF8kXDIiPJYemlDBj","principal":"[email protected]","resource":"script#type(library).name(c_ping_library).runtime.@route 86:2"}
Last updated
Was this helpful?