blob: 7adba6032a66eaeefeb52f4d86dc05aecf12f74c [file]
= JavaScript Language
:doctitle: JavaScript
:shortname: js
:artifactid: camel-javascript
:description: Evaluates a JavaScript expression
:since: 3.20
:supportlevel: Stable
:tabs-sync-option:
*Since Camel {since}*
Camel allows https://www.graalvm.org/javascript/[JavaScript] to be
used as an xref:manual::expression.adoc[Expression] or xref:manual::predicate.adoc[Predicate]
in Camel routes.
For example, you can use JavaScript in a xref:manual::predicate.adoc[Predicate]
with the xref:eips:choice-eip.adoc[Content-Based Router] EIP.
== JavaScript Options
// language options: START
include::partial$language-options.adoc[]
// language options: END
== Variables
[width="100%",cols="10%,10%,80%",options="header",]
|=======================================================================
|Variable |Type |Description
|*this* |Exchange |the Exchange is the root object
|exchange |Exchange |the Exchange
|camelContext |CamelContext |the CamelContext
|exchangeId |String |the exchange id
|message |Message |the message
|request |Message |the message (same as `message`)
|body |Object |the message body
|header |Map |the message headers (same as `headers`)
|headers |Map |the message headers
|exchangeProperty |Map |the exchange properties (same as `exchangeProperties`)
|exchangeProperties |Map |the exchange properties
|variable |Map |the exchange variables (same as `variables`)
|variables |Map |the exchange variables
|exception |Exception |the exception if the exchange failed (or the caught exception in an error handler), otherwise `null`
|context |CamelContext |*Deprecated* use `camelContext`
|properties |Map |*Deprecated* use `exchangeProperties`
|=======================================================================
The variables have the same names as in the xref:groovy-language.adoc[Groovy] language, except `in`, which is a
reserved word in JavaScript (use `message` or `request`), and the deprecated `out` and `response`. The deprecated
`context` and `properties` still work.
The `variable` and `variables` bindings are the exchange-scoped variables (for example set with the
xref:eips:setVariable-eip.adoc[Set Variable] EIP). Global and route variables, such as `global:foo`,
are not in this map; use `exchange.getVariable('global:foo')` for those.
== Examples
A JavaScript predicate in a xref:eips:choice-eip.adoc[Content-Based Router]:
[source,yaml]
----
- route:
from:
uri: direct:orders
steps:
- choice:
when:
- expression:
js:
expression: "headers.get('priority') == 'high'"
steps:
- to:
uri: direct:fast
otherwise:
steps:
- to:
uri: direct:normal
----
A JavaScript expression that sets the message body from the body and a header:
[source,yaml]
----
- route:
from:
uri: direct:greet
steps:
- setBody:
expression:
js:
expression: "'Hello ' + body + ', your priority is ' + headers.get('priority')"
- to:
uri: log:greeting
----
== Dependencies
To use JavaScript in your Camel routes, you need to add the dependency on
*camel-javascript*, which implements the JavaScript language (JavaScript with GraalVM).
If you use Maven, you could add the following to your pom.xml,
substituting the version number for the latest & greatest release.
[source,xml]
-------------------------------------
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-javascript</artifactId>
<version>x.x.x</version>
</dependency>
-------------------------------------