Как я могу обрабатывать методы в асинхронном программировании, используя node.js, ajax и mysql? - PullRequest
0 голосов
/ 03 декабря 2018

Мой вопрос касается обработки методов с использованием Node.JS, ajax и mysql с кодом ниже.

Если клиент вводит правильный пароль и имя пользователя, сервер возвращает значение "true" моему внешнему интерфейсу(index.html) и страница перенаправляется на страницу chat.html, если имя пользователя и пароль верны, возвращает «false» и отображается сообщение.

Однако, когда я пытаюсь использовать тот же код и информацию о пользователе, иногда я получаю сообщение «Ошибка: запись после завершения», а иногда нет, и появляется chat.html.Я предполагаю, что это связано с асинхронным программированием, так как я часто использую "response.write", кажется, что они смешаны с таковыми в методе fs.readFile ().

Как мне заменить мои коды или какя могу преодолеть эту ситуацию?Поскольку я новичок в node.js, меня это очень смущает.

var http = require ('http');
var url = require('url');
var fs = require('fs');
var json;
var mysql = require('mysql');


var con = mysql.createConnection({
    host: "127.0.0.1",
    user: "root",
    password: "123456",
    database: "web-chat",
    timeout:"100ms"
});
   

con.connect(function (err) {
   if (err){
       throw err;
   }

    http.createServer(function (request,response) {

        var q = url.parse(request.url, true);
        var filename = "."+q.pathname;
        var uid = q.query.uid;
        var pass = q.query.pass;

        console.log(filename);

        if (q.pathname == "/" || q.pathname == ""  || q.pathname=="./") {
            filename = "./index.html";
        }


        if (q.pathname == "/login"){

            console.log("id: "+uid," pass:"+pass);


            con.query("SELECT * FROM user_table WHERE user_id='"+uid+"' AND password='"+pass+"'", function (err, result, fields) {
                if (err) throw err;

                //console.log(result[0].user_id);
                console.log(uid);

                if(result==""){                 //LOGIN FAILED
                    response.write("false");
                    return response.end();
                }
                else {                  //LOGIN SUCCESSFUL
                    response.write("true");
                    return response.end();
                }

            });
        }

        fs.readFile(filename, function (err, data) {

            if(err){
                console.log("false");
                response.writeHead(404,{'Content-Type':'text/html'});
                return response.end();
            }else{
                console.log("true");
                response.writeHead(200,{'Content-Type':'text/html'});
                response.write(data);
                return response.end();
            }

        });

    }).listen(1337);

});
<!DOCTYPE html>
<html lang="en">
<head>
    <style>
        #frame-div{
            border: lightgray solid 1px;
            border-radius: 3px;
            width: 40%;
            margin: auto;
        }
        body{
            font-family: Calibri;
        }
        .label{
            display: table-cell;
            padding-top: 15px;
            padding-bottom: 5px;
        }
        .table{
            display: table;
        }
        .table-row{
            display: table-row;
        }
    </style>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="frame-div" class="table">

    <div class="table-row">


        <div class="label">Kullanıcı Adı:</div>
        <div class="label"><input id="user-id" type="text"></div>

    </div>
    <div class="table-row">

        <div class="label">Parola:</div>
        <div class="label"><input id="password" type="password"></div>

    </div>
    <div class="table-row">

        <div class="label">
            <input type="button" value="Giriş Yap" onclick="Login()">
            <form action="registration.html" style="display: inline-block">
                <input type="submit" value="Üye Ol">
            </form></div>

    </div>

</div>

<p id="content"></p>

<script>

    function Login() {
        var userId=document.getElementById("user-id").value;
        var password=document.getElementById("password").value;
        var xhttp;


        xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function () {

            if(this.readyState == 4 && this.status == 200){

                var isregisteredUser=this.responseText;

                console.log("reg user:"+isregisteredUser);

                //console.log(this.responseText.uid);

                if(isregisteredUser=='true'){
                    window.location.href='chat.html?uid='+userId;
                }else
                {
                    document.getElementById("content").innerHTML += "<br/>"+"Hatalı Kullanıcı Adı/Parola";
                }
            }
        };

        xhttp.open("GET","login?uid="+userId+"&pass="+password,true);
        xhttp.send();
    }

</script>

</body>
</html>

Код ошибки, который я иногда получаю, а иногда нет с тем же кодом:

events.js:183
  throw er; // Unhandled 'error' event
  ^

Error: write after end
at write_ (_http_outgoing.js:622:15)
at ServerResponse.write (_http_outgoing.js:617:10)
at Query.<anonymous> (C:\Node JS Projects\Web Chat App\server.js:53:30)
at Query.<anonymous> (C:\Node JS Projects\Web Chat App\node_modules\mysql\lib\Connection.js:502:10)
at Query._callback (C:\Node JS Projects\Web Chat App\node_modules\mysql\lib\Connection.js:468:16)
at Query.Sequence.end (C:\Node JS Projects\Web Chat App\node_modules\mysql\lib\protocol\sequences\Sequence.js:83:24)
at Query._handleFinalResultPacket (C:\Node JS Projects\Web Chat App\node_modules\mysql\lib\protocol\sequences\Query.js:139:8)
at Query.EofPacket (C:\Node JS Projects\Web Chat App\node_modules\mysql\lib\protocol\sequences\Query.js:123:8)
at Protocol._parsePacket (C:\Node JS Projects\Web Chat App\node_modules\mysql\lib\protocol\Protocol.js:278:23)
at Parser.write (C:\Node JS Projects\Web Chat App\node_modules\mysql\lib\protocol\Parser.js:76:12)

1 Ответ

0 голосов
/ 03 декабря 2018

if (q.pathname == "/login"){ затем вы входите в ветку, и когда вы получаете ответ от MySQL, вы пишете некоторый контент return response.end();

Для любого пути, даже указанного выше, вы вызываете fs.readFile, а затем, когда выполучите данные, которые вы пишете, некоторый контент и return response.end();

Вам нужен if/else, а не if - тогда сделайте это в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...