Node.js receiving GET command

Asked

Viewed 1,172 times

2

Hello, due to some problems to load the bootstrap Twitter libraries in my project, I made several changes to it, in which with help from other users, I arrived at the following Node.js code:

Node.js

var http = require("http").createServer(servidor);
var io = require("socket.io").listen(http);
var fs = require("fs");
var querystring = require('querystring');

var contentTypes = {
    js: 'text/javascript',
    css: 'text/css',
    json: 'application/json',
    png: 'image/png',
    jpg: 'image/png',
    wav: 'audio/wav'
};

var recebido;

function processPost(request, response, callback) {
    // Código boilerplate pra receber a querystring pedido HTTP,
    // convertê-la e formatá-la em uma coleção de pares chave-valor

    var queryData = "";
    if(typeof callback !== 'function') return null;

    request.on('data', function(data) {
        queryData += data;
    });

    request.on('end', function() {
        request.post = querystring.parse(queryData);
        callback();
    });
}

function servidor(req, res) {
    var contentType = 'text/html';
    var filePath = '.' + req.url;

    if(req.method == 'POST') {
        // Se o método do pedido for HTTP POST, processa a querystring

        processPost(req, res, function() {
            // Imprime a querystring convertida em chaves-valores
            console.log(req.post);
            // O request.post está disponível para ser usado aqui

            // Retorna a página para o cliente com o cód. HTTP 200 (OK)
            res.writeHead(200, "OK", {'Content-Type': 'text/plain'});
            res.end();
        });
    }
    else if (filePath == './' || filePath == './index.html') filePath = './index.html';
    else contentType = contentTypes[req.url.split('.').pop()];
    fs.readFile(filePath, function(error, content) {
        if (error) {
            if (error.code == 'ENOENT') {
                fs.readFile('./404.html', function(error, content) {
                    res.writeHead(200, {
                        'Content-Type': 'text/html'
                    });
                    res.end(content, 'utf-8');
                });
            } else {
                res.writeHead(500);
                res.end('Ooops... houve um erro: ' + error.code + ' ..\n');
                res.end();
            }
        } else {
            res.writeHead(200, {
                'Content-Type': contentType
            });
            res.end(content, 'utf-8');
        }
    });
}


http.get('/teste', function(req, res) {
    res.charset = 'UTF-8'
    res.send(recebido);
});


http.listen(5000, "192.168.0.108", function() {
    var host = http.address().address;
    var port = http.address().port;
    console.log('Exemplo na URL http://%s:%s', host, port);
});

However, when I put the IP in my Browser http://192.168. 0.108/test, does not return any information. Below my HTML code:

<!DOCTYPE html>
<html lang="en">

<head>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>SmartHouse</title>

    <!-- Bootstrap Core CSS -->
    <link href="/css/bootstrap.min.css" rel="stylesheet">

    <!-- Custom CSS -->
    <link href="/css/sb-admin.css" rel="stylesheet">

    <!-- Morris Charts CSS -->
    <link href="/css/plugins/morris.css" rel="stylesheet">

    <!-- Custom Fonts
    <link href="font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css"> -->
    <script src="/font-awesome/font.js"></script>

    <script src="/js/socket.io-1.4.5.js"></script> <!-- chamamos o socket.io que por padrão o socket.io cria a rota http sem precisarmos interferir -->

    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
        <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
        <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->

</head>

<body>

    <div id="wrapper">

        <!-- Navigation -->
        <nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
            <!-- Brand and toggle get grouped for better mobile display -->
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="index.html">Sistema Smart House - Automação Residencial</a>
            </div>
            <!-- Top Menu Items -->

            <!-- Sidebar Menu Items - These collapse to the responsive navigation menu on small screens -->
            <div class="collapse navbar-collapse navbar-ex1-collapse">
                <ul class="nav navbar-nav side-nav">
                    <li>
                        <a href="/index.html"><i class="fa fa-home"></i> Home</a>
                    </li>
                    <li>
                        <a href="sala.html"><i class="fa fa-television"></i> Sala</a>
                    </li>
                    <li>
                        <a href="cozinha.html"><i class="fa fa-birthday-cake"></i> Cozinha</a>
                    </li>
                    <li class="active">
                        <a href="javascript:;" data-toggle="collapse" data-target="#demo"><i class="fa fa-bed"></i> Quartos <i class="fa fa-fw fa-caret-down"></i></a>
                        <ul id="demo" class="collapse">
                            <li class="active">
                                <a href="quarto1.html"> Quarto 1</a>
                            </li>
                            <li>
                                <a href="quarto2.html"> Quarto 2</a>
                            </li>
                        </ul>
                    </li>
                    <li>
                        <a href="#"><i class="fa fa-bell"></i> Alarme</a>
                    </li>
                </ul>
            </div>
            <!-- /.navbar-collapse -->
        </nav>

        <div id="page-wrapper">

            <div class="container-fluid">

                <!-- Page Heading -->
                <div class="row">
                    <div class="col-lg-12">
                        <h1 class="page-header">
                            Quarto 1 <small>Geral</small>
                        </h1>
                        <ol class="breadcrumb">
                            <li class="active">
                                <i class="fa fa-bed"></i> Quarto 1
                            </li>
                        </ol>
                    </div>
                </div>
                <!-- /.row -->
                <div class="row">
                    <div class="col-lg-4">
                    </div>
                        <div class="col-lg-4">
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                    <h1><center>Quarto 1 - Lampada</center></h1>
                                </div>
                                <div class="panel-body">
                                    <a onclick="enviarComandoON()" class="btn btn-success btn-lg btn-block" id="QTD1LED, ON">ON</a>
                                    <a onclick="enviarComandoOFF()" class="btn btn-danger btn-lg btn-block" id="QTD1LED, OFF">OFF</a>
                                </div>
                            </div>
                        </div>
                    <div class="col-lg-4">
                    </div>
                </div>
                <!-- /.row -->

            </div>
            <!-- /.container-fluid -->

        </div>
        <!-- /#page-wrapper -->

    </div>
    <!-- /#wrapper -->

    <!-- jQuery -->
    <script src="/js/jquery.js"></script>

    <!-- Bootstrap Core JavaScript -->
    <script src="/js/bootstrap.min.js"></script>

    <!-- Morris Charts JavaScript -->
    <script src="/js/plugins/morris/raphael.min.js"></script>
    <script src="/js/plugins/morris/morris.min.js"></script>
    <script src="/js/plugins/morris/morris-data.js"></script>
    <script type="text/javascript">
        var socket = io.connect();
        //função que é disparada quando é pressionado o botão
        function enviarComandoON(){
            var status = document.getElementById("QTD1LED, ON").id;
            var msg = '{' + status + '}';
            socket.emit('mensagem', msg); //enviamos o valor do input
        }
        function enviarComandoOFF(){
            var status = document.getElementById("QTD1LED, OFF").id;
            var msg = '{' + status + '}';
            socket.emit('mensagem', msg); //enviamos o valor do input
        }
    </script>

</body>

</html>

How can I change my code, using the libraries informed above, to work the GET command, in which you will receive information from the variable "received", a string, such as: {QTD1LED, ON}

  • Possible duplicate of Buttons with HTTP Request Action

  • actually this is test with Socket i.o @rodorgas

  • Your other question tbm is with socket.io http://answall.com/questions/152121/html-bootstrap-node-js Have a reason for using socket.io?

  • @rodorgas no, but I need to click a button and send information to Node

  • 1

    As I mentioned earlier, you are using the module socket.io unnecessarily... Now it’s gotten even worse, because you’ve included the framework express unnecessarily.... The express is stealing the treatment from the event request, therefore its function servidor is not being called... My suggestion is: first remove socket.io and express. Then test and see what happens. There will probably be more mistakes, but the way it is won’t work anyway.

  • @joséx. I edited the new Node.js code in the body of the question. But it has an error in http.get. I’m not getting a solution for this case. Could you help me? Thank you!

Show 1 more comment

1 answer

0

I won’t go into detail about your program, I would have to understand it first, but I will show you a minimal example of a Node.js application.

Important: you do not need to "get" to read an http request, Node already does this automatically.

Example 1

This is a Node.js application that answers "Hello world" when queried by the browser with the url http://127.0.0.1:8081/.

Note that Node automatically receives requests, you do not need to do "http.get", or use "express", or "socket.io".

var http = require("http");

http.createServer(function (request, response) {

   // Send the HTTP header 
   // HTTP Status: 200 : OK
   // Content Type: text/plain
   response.writeHead(200, {'Content-Type': 'text/plain'});

   // Send the response body as "Hello World"
   response.end('Hello World\n');
}).listen(8081);

// Console will print the message
console.log('Server running at http://127.0.0.1:8081/');

This application is written in the short style of Javascript programmers, practically everyone writes like this, but I as a C++ programmer have a certain difficulty with this style.

Example 2

In this example I separated the functions a little, but the operation is equal to the first example, only showing ip and port of the client that connected.

var http = require("http");

var server = http.createServer(function (request, response) {

   // Send the HTTP header 
   // HTTP Status: 200 : OK
   // Content Type: text/plain
   response.writeHead(200, {'Content-Type': 'text/plain'});

   // Send the response body as "Hello World"
   response.end('Hello World\n');
});

server.listen("8081", "0.0.0.0", function() {
   var host = this.address().address;
   var port = this.address().port;
   console.log("aguardando conexoes em " + host + ":" + port)
   });

server.on("connection", function(socket) {
   var host = socket.remoteAddress;
   var port = socket.remotePort;
   console.log("recebeu conexao de " + host + ":" + port);
});

Example 3

This example works the same as the previous example, but I separated everything I could separate. Note that Javascript programmers nay program like this, but I think it gets easier to understand, less overloaded, especially for small programs.

var http = require("http")

function onRequest(request, response)
{
   // Send the HTTP header 
   // HTTP Status: 200 : OK
   // Content Type: text/plain
   response.writeHead(200, {'Content-Type': 'text/plain'});

   // Send the response body as "Hello World"
   response.end('Hello World\n');
}

function onListening()
{
   var host = this.address().address;
   var port = this.address().port;
   console.log("aguardando conexoes em " + host + ":" + port);
}

function onConnection(socket)
{
   var host = socket.remoteAddress;
   var port = socket.remotePort;
   console.log("recebeu conexao de " + host + ":" + port);
}

var server = http.createServer(onRequest);

server.listen(8081, "127.1", onListening);

server.on("connection", onConnection);

Browser other questions tagged

You are not signed in. Login or sign up in order to post.