<!-- review: finished -->

<a id="external-njs"></a>

# NJS

El módulo proporciona integración del lenguaje de programación JavaScript en
el modelo de procesamiento de eventos de Angie y permite ampliar la funcionalidad del servidor utilizando
scripts JavaScript. Consta de dos módulos:

- [HTTP JS](https://es.angie.software//angie/docs/installation/external-modules/http_js.md#http-js) — para procesar tráfico HTTP;
- [Stream JS](https://es.angie.software//angie/docs/installation/external-modules/stream_js.md#stream-js) — para procesar tráfico TCP/UDP.

<a id="installation-19"></a>

## Instalación

Para [instalar](https://es.angie.software//angie/docs/installation/index.md#install-packages) el módulo, utilice uno de
los siguientes paquetes:

- Angie: `angie-module-njs` o `angie-module-njs-light`;
- Angie PRO: `angie-pro-module-njs` o `angie-pro-module-njs-light`.

<a id="features-1"></a>

## Características

El módulo amplía la funcionalidad del servidor utilizando scripts escritos en njs,
un subconjunto de JavaScript, permitiendo la implementación de lógica personalizada del lado del servidor
y mucho más:

- Control de acceso complejo y comprobaciones de seguridad antes de
  que la solicitud llegue al servidor proxy.
- Manipulación de encabezados de respuesta.
- Escritura de manejadores asíncronos flexibles y filtros de contenido.

También está disponible una utilidad de línea de comandos independiente que puede utilizarse
independientemente del servidor para desarrollar y depurar scripts njs.

<a id="loading-the-module-19"></a>

## Carga del Módulo

Carga de módulos en el contexto `main{}`:

```nginx
load_module modules/ngx_http_js_module.so;    # para HTTP
load_module modules/ngx_stream_js_module.so;  # para Stream
```

<a id="usage"></a>

## Uso

La documentación detallada está disponible en las secciones de módulos individuales:

- [HTTP JS](https://es.angie.software//angie/docs/installation/external-modules/http_js.md#http-js)
- [Stream JS](https://es.angie.software//angie/docs/installation/external-modules/stream_js.md#stream-js)

<a id="security"></a>

## Seguridad

El módulo no ejecuta código dinámico, especialmente código recibido desde la red.
La única forma de ejecutar dicho código utilizando njs es configurar la
directiva `js_import` en la configuración del servidor. El código JavaScript se carga una vez
al iniciar el servidor.

En el modelo de amenazas del módulo, el código JavaScript se considera una fuente confiable al igual que
el archivo de configuración y los certificados del sitio. En la práctica, esto significa lo siguiente:

- la divulgación de contenidos de memoria y otros problemas de seguridad causados por
  la modificación del código JavaScript no se consideran problemas de seguridad,
  sino que se tratan como errores regulares;
- deben tomarse medidas para proteger el código JavaScript utilizado por el módulo;
- si no hay directivas `js_import` en el archivo de configuración,
  el servidor está protegido contra vulnerabilidades relacionadas con JavaScript.

<a id="command-line-utility"></a>

## Utilidad de Línea de Comandos

La utilidad de línea de comandos **njs** ayuda a desarrollar y depurar scripts njs
y se instala junto con los módulos. A diferencia de cuando el módulo se ejecuta
como parte de Angie, los objetos de Angie (`HTTP` y
`Stream`) no están disponibles al utilizar la utilidad.

Ejemplos de uso de la utilidad:

```console
$ echo "2**3" | njs -q
8

$ njs

>> globalThis
global {
 njs: njs {
  version: '0.3.9'
 },
 global: [Circular],
 process: process {
  argv: [
   '/usr/bin/njs'
  ],
...
```

<a id="preloaded-objects"></a>

## Objetos Precargados

Para cada solicitud entrante, el módulo crea una máquina virtual separada. Esto
proporciona muchos beneficios, como consumo de memoria predecible y
aislamiento de solicitudes. Sin embargo, dado que todas las solicitudes están aisladas, si un manejador
de solicitudes necesita acceder a cualquier dato, debe leerlo
él mismo. Esto es ineficiente, especialmente cuando el volumen de datos es grande.

Para resolver este problema, se introdujo un mecanismo de objetos compartidos precargados.
Tales objetos se crean como inmutables y no tienen cadenas de prototipos: sus valores
no pueden cambiarse, las propiedades no pueden agregarse ni eliminarse.

Aquí hay algunos ejemplos de trabajo con objetos precargados en njs:

- Acceso a propiedades por nombre:
  ```javascript
  preloaded_object.prop_name
  preloaded_object[prop_name]
  ```
- Enumeración de propiedades:
  ```javascript
  for (i in preloaded_object_name) {
        // ...
  }
  ```
- Aplicación de métodos integrados no modificadores utilizando `call()`:
  ```javascript
  Array.prototype.filter.call(preloaded_object_name, ...)
  ```

<a id="api-reference"></a>

## Referencia de API

Para una referencia completa de todos los objetos, métodos y propiedades de njs, consulte:

- [Referencia de la API de NJS](https://es.angie.software//angie/docs/configuration/njs-reference.md#njs-reference)

<a id="additional-information-20"></a>

## Información Adicional

- Sitio web oficial: [https://nginx.org/en/docs/njs/](https://nginx.org/en/docs/njs/)
- Ejemplos de uso: [https://github.com/nginx/njs-examples/](https://github.com/nginx/njs-examples/)
