Integración de apex más node js Parte 3
¡Por fiiiin amigos! ha llegado la hora de conectar socket io desde node con apex, mi parte favorita porque es la que más le gusta a los usuarios. En fin, te sugiero veas el vídeo y aquí te dejo el código usado en el vídeo y la app para que no tengas ningún problema al usarla y analizarla.
¡NO OLVIDES CREAR EL ACL!
Javascript
var socket = io('//localhost:3002'); socket.on('connect', function(){ console.log('Cliente conectado') }); socket.on('mensaje', function(res){ console.log('API NODE ' , res); newUser(); }) function newUser(){ apex.server.process( 'GuardarDatosDePstgresql', // Process or AJAX Callback name {}, // Parameter "x01" { success: function (pData) { // Success Javascript var region = apex.region( "reporte" ); var chart = apex.region("chartusers"); region.refresh(); chart.refresh(); }, dataType: "text" // Response type (here: plain text) } ); //GuardarDatosDePstgresql }
AJAX CALLBACK
declare l_request SYS.utl_http.req; l_response SYS.utl_http.resp; l_download RAW(32767); l_url_o varchar2(4000) := '//localhost:3002/user/'; l_url varchar2(200); l_plain varchar(4000); jo JSON_OBJECT_T; ja JSON_ARRAY_T; keys JSON_KEY_LIST; keys_string VARCHAR2(100); begin l_request := SYS.utl_http.begin_request(l_url_o); SYS.utl_http.set_header(l_request, 'User-Agent', 'Mozilla/5.0 (Windows NT x.y; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0'); l_response := SYS.utl_http.get_response(l_request); LOOP BEGIN SYS.utl_http.read_raw(l_response, l_download); l_plain := UTL_RAW.CAST_TO_VARCHAR2 (l_download) ; for rec IN ( select j.usuario,j.nombre , j.email, j.direccion, j.id from json_table(l_plain,'$[*]' COLUMNS usuario varchar2(255) PATH '$.usuario', nombre varchar2(255) PATH '$.nombre', email varchar2(255) PATH '$.email', direccion varchar2(255) PATH '$.direccion', id number PATH '$.id' ) j ) LOOP insert into usuarios (usuario,nombre,email,direccion,id) values (rec.usuario,rec.nombre,rec.email,rec.direccion,rec.id); END LOOP; commit; EXCEPTION WHEN SYS.utl_http.end_of_body THEN EXIT; END; END LOOP; SYS.utl_http.end_response(l_response); end;
CREAR ACL
DECLARE l_acl VARCHAR2(100) := 'apinodejs.xml'; l_desc VARCHAR2(100) := 'descripción del acl'; l_principal VARCHAR2(30) := 'APEXDEVELOPERS'; -- EN MAYÚSCULAS l_host VARCHAR2(100) := 'localhost'; --nombre del host BEGIN -- Crea el nuevo ACL -- Proveer privilegios de conexión dbms_network_acl_admin.create_acl(l_acl, l_desc, l_principal, TRUE, 'connect'); -- Permisos de resolución de DNS dbms_network_acl_admin.add_privilege(l_acl, l_principal, TRUE, 'resolve'); -- Pasamos lo parámetros nombre del acl y host dbms_network_acl_admin.assign_acl(l_acl, l_host); COMMIT; END; / SELECT host, lower_port, upper_port, acl FROM dba_network_acls; /
Vídeo
Descarga la app de apex
Link de descarga de la aplicación
Ligas de interés
https://cdnjs.com/libraries/socket.io
https://expressjs.com/en/resources/middleware/cors.html
Post sugerido:
Por favor si te sirvió el vídeo, invítame un café dando clic a los anuncios, me ayuda muchísimo para no dormir y poder hacer más posts
Gracias Enrique por tan buen aporte a los que nos iniciamos en APEX. Tengo una consulta. Haciendo este ejercicio, obtuve el siguiente error cuando di F12 a la ejecución en APEX:
Access to fetch at ‘http://localhost:3002/socket.io/?EIO=4&transport=polling&t=OineIfd’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled
¿Como puedo resolverlo ? Gracias
Hola Marco instala cors
npm install cors –save
y agregas estas lineas
var whitelist = [‘http://localhost:8080’, ‘http://localhost:8081’]
var corsOptionsDelegate = function (req, callback) {
var corsOptions;
if (whitelist.indexOf(req.header(‘Origin’)) !== -1) {
corsOptions = { origin: true } // reflect (enable) the requested origin in the CORS response
}else{
corsOptions = { origin: false } // disable CORS for this request
}
callback(null, corsOptions) // callback expects two parameters: error and options
}