Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di andbaz
    Registrato dal
    Jul 2011
    residenza
    Usa
    Messaggi
    440

    Semplice applicazione Client-Server in Node.js con Api.ai: errore, perché?

    Ciao, sto costruendo una applicazione client-server per una chat tra gli utenti e la risposta proveniente da una Api (Api.ai). Questi sono i file, mi viene fuori un errore e non lo capisco:

    Fetch API cannot load http://127.0.0.1:3000/?question=Hi. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:8080' is therefore not allowed access. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
    script.min.js:30 Error: TypeError: Failed to fetch

    Dove sto sbagliando?
    Grazie

    client.js
    codice:
    var http = require('http');
    
    
    document.getElementById('submit').onclick = () => {
      console.log('OK');
      const question = '/?question=' +  encodeURIComponent(document.getElementById('question').value);
    
    
      const options =
      {
        hostname: '127.0.0.1',
        port: 3000,
        path: question,
        method: 'GET',
        headers: {
          // Authorization: 'Bearer ' + clientAccessToken,
        },
      };
    
    
      http.get(options, (res) => {
        let body = '';
        res.on('data', (data) => {
          body += data;
        });
        res.on('end', () => {
          const result = JSON.parse(body);
          console.log('result' + result);
        });
      }).on('error', (e) => {
        console.log('Error: ' + e);
      });
    };
    server.js
    codice:
    var apiai = require('apiai');
    const http = require('http');
    var url = require('url');
    
    
    const server = http.createServer((req, res) => {
      var parts = url.parse(req.url, true);
      var query = parts.query;
      console.log(query.question);
      var question = query.question;
    
    
      var app = apiai("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
    
    
      var request = app.textRequest(question, {
          sessionId: '<unique session id>'
      });
    
    
      request.on('response', function(response) {
        var ress = response.result.fulfillment.speech;
        res.writeHead(200, {"Content-Type": "text/plain"});
        res.write(ress);
        // res.end(ress);
        console.log(response.result.fulfillment.speech);
      });
    
    
      request.on('error', function(error) {
          console.log(error);
      });
    
    
      request.end();
    });
    
    
    server.listen(3000);

  2. #2
    Utente di HTML.it L'avatar di m4rko80
    Registrato dal
    Aug 2008
    residenza
    Milano
    Messaggi
    2,654
    Ciao, l'errore indicato e' diciamo piuttosto banale. Node js o meno stai facendo una chiamata client side verso un dominio che non è lo stesso dove gira l'applicazione e nella configurazione dell'host che riceve la chiamata non è settato appunto:

    Access-Control-Allow-Origin : *
    https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

    Per una questione di sicurezza questa regola va abilitata per l'occasione.
    L'alternativa è fare una chiamata sullo stesso host e fare la chiamate verso l'host esterno lato server

  3. #3
    Utente di HTML.it L'avatar di andbaz
    Registrato dal
    Jul 2011
    residenza
    Usa
    Messaggi
    440
    Quote Originariamente inviata da m4rko80 Visualizza il messaggio
    Ciao, l'errore indicato e' diciamo piuttosto banale. Node js o meno stai facendo una chiamata client side verso un dominio che non è lo stesso dove gira l'applicazione e nella configurazione dell'host che riceve la chiamata non è settato appunto:

    Access-Control-Allow-Origin : *
    https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

    Per una questione di sicurezza questa regola va abilitata per l'occasione.
    L'alternativa è fare una chiamata sullo stesso host e fare la chiamate verso l'host esterno lato server
    Wow hai ragione, funziona!

    Ho semplicemente aggiunto dentro http.createServer() in server.js questa riga di codice e funziona:

    codice:
    res.setHeader('Access-Control-Allow-Origin', '*');
    Quindi se mi funziona nel localhost, anche sul server remoto dovrebbe funzionare giusto?

    Una cosa non capisco: il server ascolta sulla porta 3000 all'indirizzo 127.0.0.1, ma anche il client giusto? Non capisco il fatto che questo CORS sia stato necessario nel mio caso.

  4. #4
    Utente di HTML.it L'avatar di m4rko80
    Registrato dal
    Aug 2008
    residenza
    Milano
    Messaggi
    2,654
    Una risposta potrebbe essere questa, nello specifico non ti so dire. https://stackoverflow.com/questions/...he-same-domain

  5. #5
    Utente di HTML.it L'avatar di andbaz
    Registrato dal
    Jul 2011
    residenza
    Usa
    Messaggi
    440
    Ultimo errore che non capisco, poi chiudo il thread

    Ho provato a caricare sul mio server remoto l'applicazione a cui ho modificato gli inirizzi

    Ma sembra non funzionare, in locale mi ritorna ###########****************<RISPOSTA>

    Invece in remoto:

    OK
    VM74:1 GET http://its4vr.altervista.org:3000/bazbot/?question=Hi net::ERR_CONNECTION_REFUSED
    script.min.js:31 Error: TypeError: Failed to fetch


    client.js
    codice:
    js
    var http = require('http');
    
    
    document.getElementById('submit').onclick = () => {
      console.log('OK');
      const question = '?question=' +  encodeURIComponent(document.getElementById('question').value);
    
    
      const options =
      {
        hostname: 'its4vr.altervista.org',
        port: 3000,
        path: '/bazbot/' + question,
        method: 'GET',
        headers: {
          // Authorization: 'Bearer ' + clientAccessToken,
        },
      };
    
    
      http.get(options, (res) => {
        let body = '';
        res.on('data', (data) => {
          body += data;
        });
        res.on('end', () => {
          const result = body;
          console.log('####################' + result);
          document.getElementById('answer').innerHTML = result;
        });
      }).on('error', (e) => {
        console.log('Error: ' + e);
      });
    };
    server.js
    codice:
    js
    var apiai = require('apiai');
    const http = require('http');
    var url = require('url');
    
    
    const server = http.createServer((req, res) => {
      res.setHeader('Access-Control-Allow-Origin', '*');
    
    
      var parts = url.parse(req.url, true);
      var query = parts.query;
      console.log(query.question);
      var question = query.question;
    
    
      var app = apiai("xxxxxxxxxxxxxxxxxxxxxxxxx");
    
    
      var request = app.textRequest(question, {
          sessionId: '<unique session id>'
      });
    
    
      request.on('response', function(response) {
        var ress = response.result.fulfillment.speech;
        res.writeHead(200, {"Content-Type": "text/plain"});
        res.write('******************' + ress);
        res.end();
        console.log(response.result.fulfillment.speech);
      });
    
    
      request.on('error', function(error) {
          console.log(error);
      });
    
    
      request.end();
    });
    
    
    server.listen(3000);

  6. #6
    Utente di HTML.it L'avatar di andbaz
    Registrato dal
    Jul 2011
    residenza
    Usa
    Messaggi
    440
    Ok ho capito perché: in fase di sviluppo lanciavo Gulp che con gulp-forever-monitor avviava il server ma ora in remoto in fase di produzione non ho nessun motore che accenda il server quindi provo a trovare una soluzione.

  7. #7
    Utente di HTML.it L'avatar di andbaz
    Registrato dal
    Jul 2011
    residenza
    Usa
    Messaggi
    440
    Ok niente da fare, non ci riesco perché nonostante abbia studiato non riesco a capirne il funzionamento per cui resto dell'idea di utilizzare Api.ai solo lato client e non server e funziona anche se credo non sia così giusto utilizzare perché non c'è nessun accenno sul README.md di Api.ai...

    Voi cosa ne dite? Ormai chiedo e rispondo da solo, ma lo capisco.

    codice:
    const https = require('https');
    
    
    const clientAccessToken = 'XXXXXXXXXXXXXXXXXXXXXXXXX';
    
    
    const callback = (data) => {
      console.log(data);
      document.getElementById('answer').innerHTML = data.result.speech;
    };
    
    
    document.getElementById('submit').onclick = () => {
      const question = document.getElementById('question').value;
    
    
      const options =
      {
        hostname: 'api.api.ai',
        path: '/v1/query?lang=EN&query=' + encodeURIComponent(question) + '&sessionId=1',
        method: 'GET',
        headers: {
          Authorization: 'Bearer ' + clientAccessToken,
        },
      };
    
    
      https.get(options, (res) => {
        let body = '';
        res.on('data', (data) => {
          body += data;
        });
        res.on('end', () => {
          const result = JSON.parse(body);
          callback(result);
        });
      }).on('error', (e) => {
        console.log('Error: ' + e);
      });
    };

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.