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
}