¿Qué es este Javascript "requiere"?
database postgresql (5)
Entonces, ¿qué es esto "requiere?"
require()
no es parte de la API de JavaScript estándar. Pero en Node.js, es una función incorporada con un propósito especial: cargar módulos .
Los módulos son una forma de dividir una aplicación en archivos separados en lugar de tener toda su aplicación en un solo archivo. Este concepto también está presente en otros lenguajes con pequeñas diferencias en la sintaxis y el comportamiento, como la include
de C, el use
de PHP, la import
de Python, etc.
Una gran diferencia entre los módulos Node.js y JavaScript del navegador es cómo se accede al código de un script desde el código de otro script.
En el navegador JavaScript, los scripts se agregan a través del elemento
<script>
. Cuando se ejecutan, todos tienen acceso directo al ámbito global, un "espacio compartido" entre todos los scripts. Cualquier script puede definir / modificar / eliminar / llamar libremente cualquier cosa en el ámbito global.En Node.js, cada módulo tiene su propio alcance. Un módulo no puede acceder directamente a las cosas definidas en otro módulo a menos que elija exponerlas. Para exponer cosas de un módulo, deben asignarse a
exports
o amodule.exports
. Para que un módulo acceda a lasexports
otro módulo o amodule.exports
, debe usarrequire()
.
En su código, var pg = require(''pg'');
carga el módulo pg
, un cliente PostgreSQL para Node.js. Esto permite que su código acceda a la funcionalidad de las API del cliente PostgreSQL a través de la variable pg
.
¿Por qué funciona en un nodo pero no en una página web?
require()
, module.exports
y exports
son API de un sistema de módulos que es específico de Node.js. Los navegadores no implementan este sistema de módulos.
Además, antes de que funcionara en node, tuve que hacer npm install pg. ¿De qué trata eso?
NPM es un servicio de repositorio de paquetes que aloja módulos JavaScript publicados. npm install
es un comando que le permite descargar paquetes desde su repositorio.
¿Dónde lo puso y cómo lo encuentra Javascript?
Node.js tiene documentación muy detallada sobre cómo los módulos encuentran otros módulos . Pero en un principio, coloca todos los módulos descargados en node_modules
en el directorio donde ejecutó npm install
.
Estoy intentando obtener Javascript para leer / escribir en una base de datos PostgreSQL. Encontré este project en github. Pude obtener el siguiente código de ejemplo para ejecutar en el nodo.
var pg = require(''pg''); //native libpq bindings = `var pg = require(''pg'').native`
var conString = "tcp://postgres:1234@localhost/postgres";
var client = new pg.Client(conString);
client.connect();
//queries are queued and executed one after another once the connection becomes available
client.query("CREATE TEMP TABLE beatles(name varchar(10), height integer, birthday timestamptz)");
client.query("INSERT INTO beatles(name, height, birthday) values($1, $2, $3)", [''Ringo'', 67, new Date(1945, 11, 2)]);
client.query("INSERT INTO beatles(name, height, birthday) values($1, $2, $3)", [''John'', 68, new Date(1944, 10, 13)]);
//queries can be executed either via text/parameter values passed as individual arguments
//or by passing an options object containing text, (optional) parameter values, and (optional) query name
client.query({
name: ''insert beatle'',
text: "INSERT INTO beatles(name, height, birthday) values($1, $2, $3)",
values: [''George'', 70, new Date(1946, 02, 14)]
});
//subsequent queries with the same name will be executed without re-parsing the query plan by postgres
client.query({
name: ''insert beatle'',
values: [''Paul'', 63, new Date(1945, 04, 03)]
});
var query = client.query("SELECT * FROM beatles WHERE name = $1", [''John'']);
//can stream row results back 1 at a time
query.on(''row'', function(row) {
console.log(row);
console.log("Beatle name: %s", row.name); //Beatle name: John
console.log("Beatle birth year: %d", row.birthday.getYear()); //dates are returned as javascript dates
console.log("Beatle height: %d'' %d/"", Math.floor(row.height/12), row.height%12); //integers are returned as javascript ints
});
//fired after last row is emitted
query.on(''end'', function() {
client.end();
});
Luego traté de hacerlo funcionar en una página web, pero nada parecía suceder. Lo comprobé en la consola de Javascript y simplemente dice "no se ha definido".
Entonces, ¿qué es esto "requiere?" ¿Por qué funciona en un nodo pero no en una página web?
Además, antes de que funcionara en node, tuve que hacer npm install pg
. ¿De qué trata eso? Busqué en el directorio y no encontré un archivo pág. ¿Dónde lo puso y cómo lo encuentra Javascript?
¿Sabes cómo cuando ejecutas JavaScript en el navegador, tienes acceso a variables como "ventana" o Matemáticas? No tiene que declarar estas variables, se han escrito para que las use cuando lo desee.
Bueno, cuando está ejecutando un archivo en el entorno Node.js, hay una variable que puede usar. Se llama "módulo" Es un objeto. Tiene una propiedad llamada "exportaciones". Y funciona así:
En un archivo que llamaremos example.js, usted escribe:
example.js
module.exports = "some code";
Ahora, desea que esta cadena "algún código" en otro archivo.
Nombraremos el otro archivo otherFile.js
En este archivo, usted escribe:
otroFile.js
let str = require(''example.js'')
Esa declaración require () va al archivo que coloca dentro de él, encuentra los datos almacenados en la propiedad module.exports. La parte let de str = ... de su código significa que todo lo que requiera devoluciones de instrucciones se almacena en la variable str.
Entonces, en este ejemplo, el resultado final es que en otherFile.js ahora tiene esto:
dejar cadena = "algún código";
Nota:
el nombre del archivo que se escribe dentro de la declaración de requerimiento: si es un archivo local, debe ser la ruta del archivo a example.js. Además, la extensión .js se agrega de forma predeterminada, por lo que no tuve que escribirla.
Usted hace algo similar cuando se requieren bibliotecas de node.js, como Express. En el archivo express.js, hay un objeto llamado ''módulo'', con una propiedad llamada ''exportaciones''.
Entonces, parece algo parecido a esto, debajo del capó (soy un principiante, por lo que algunos de estos detalles podrían no ser exactos, pero es para mostrar el concepto:
expreso.js
module.exports = function() {
//It returns an object with all of the server methods
return {
listen: function(port){},
get: function(route, function(req, res){}){}
}
}
Bien, comencemos primero haciendo la distinción entre Javascript en un navegador web y Javascript en un servidor (CommonJS y Node).
Javascript es un lenguaje tradicionalmente confinado a un navegador web con un contexto global limitado definido principalmente por lo que se conoce como el Nivel 0 del Modelo de Objeto de Documentos (DOM) (la API de Javascript de Netscape Navigator).
El Javascript del lado del servidor elimina esa restricción y le permite a Javascript acceder a varias piezas de código nativo (como la biblioteca de Postgres) y sockets abiertos.
Ahora require()
es una llamada de función especial definida como parte de la especificación CommonJS. En el nodo, resuelve las bibliotecas y los módulos en la ruta de búsqueda del nodo, ahora generalmente definidos como módulos de nodo en el mismo directorio (o el directorio del archivo javascript invocado) o la ruta de búsqueda en todo el sistema.
Para intentar responder el resto de su pregunta, necesitamos usar un proxy entre el código que se ejecuta en el navegador y el servidor de la base de datos.
Ya que estamos discutiendo sobre Node y usted ya está familiarizado con cómo ejecutar una consulta desde allí, tendría sentido usar Node como ese proxy.
Como un simple ejemplo, vamos a hacer una URL que devuelva algunos datos sobre un Beatle, dado un nombre, como JSON.
/* your connection code */
var express = require(''express'');
var app = express.createServer();
app.get(''/beatles/:name'', function(req, res) {
var name = req.params.name || '''';
name = name.replace(/[^a-zA_Z]/, '''');
if (!name.length) {
res.send({});
} else {
var query = client.query(''SELECT * FROM BEATLES WHERE name =/'''+name+''/' LIMIT 1'');
var data = {};
query.on(''row'', function(row) {
data = row;
res.send(data);
});
};
});
app.listen(80, ''127.0.0.1'');
Noté que mientras que las otras respuestas explicaban lo que se requiere y que se usa para cargar módulos en el nodo, no dieron una respuesta completa sobre cómo cargar módulos de nodo cuando se trabaja en el navegador.
Es bastante simple de hacer. Instale su módulo usando npm como lo describe, y el módulo en sí estará ubicado en una carpeta que generalmente se llama node_modules.
Ahora, la forma más sencilla de cargarla en su aplicación es hacer referencia a ella desde su html con una etiqueta de script que apunta a este directorio. es decir, si su directorio node_modules está en la raíz del proyecto al mismo nivel que su index.html, escribiría esto en su index.html:
<script src="node_modules/ng"></script>
Ahora se cargará todo el script en la página, para que pueda acceder a sus variables y métodos directamente.
Hay otros enfoques que se utilizan más ampliamente en proyectos más grandes, como un cargador de módulos como require.js . De los dos, no he usado Require, pero creo que muchas personas lo consideran el camino a seguir.
Se utiliza para cargar módulos. Vamos a usar un ejemplo simple.
En el archivo circle_object.js
:
var Circle = function (radius) {
this.radius = radius
}
Circle.PI = 3.14
Circle.prototype = {
area: function () {
return Circle.PI * this.radius * this.radius;
}
}
Podemos usar esto a través de require
, como:
node> require(''circle_object'')
{}
node> Circle
{ [Function] PI: 3.14 }
node> var c = new Circle(3)
{ radius: 3 }
node> c.area()
El método require()
se utiliza para cargar y almacenar en caché módulos de JavaScript. Por lo tanto, si desea cargar un módulo local de JavaScript relativo en una aplicación Node.js, simplemente puede usar el método require()
.
Ejemplo:
var yourModule = require( "your_module_name" ); //.js file extension is optional