html - Node.js 存储以前的表单数据,并在每次提交新数据时重新运行以前的 mysql 查询

标签 html mysql node.js callback

我在使用 node.js 时遇到问题,每次运行查询时,它都会重新运行之前运行的所有查询以及新查询。

更具体地说:我有一个包含三个字段的表单:名字、姓氏、电子邮件。当我提交该表格时,我想要: - 检查数据库中是否已存在该用户(我通过对电子邮件地址进行 SQL 查询来执行此操作)。 - 如果客户端存在,则在表单上显示无法添加客户端的消息。 - 如果用户不存在,则将客户端添加到数据库并在表单上显示“成功添加客户端”消息。

看起来很简单,对吧?

发生的情况是,对于我添加的第一个新用户,一切都很好。然后我添加第二个新用户,但数据库中发生的情况是它添加了两个条目:它重新添加第一个新用户,以及第二个新用户。如果我尝试添加第三个用户,它最终会运行 3 个“INSERT INTO”查询,添加第一个用户(第三次),然后再次添加第二个用户,然后是第三个。等等...

就像在表单提交之间有一些存储空间我没有清除 - 但我没有在这里使用 session ,所以我不知道这个表单数据被保存在哪里!

有什么想法吗?我对 Node.js 很陌生,我想我一定错过了一些非常基本的东西,但我看不到它。

这是我的“index.html”文件中的 JavaScript 和表单:

<script type="text/javascript"> 
    $(document).ready(function(){
        $("#new_client").submit(function(){
            var form = $(this);

            //remove previous message section
            form.siblings('p').remove();

            $.getJSON(
                form.attr('action'),
                form.serialize(),
                function (result){
                    if (result.success == true){
                        $(form).before("<p>Success: "+result.message+"</p>");
                    }
                    else if (result.success == false){
                        var html = "";
                        for (var i = 0; i < result.message.length; i++){
                            html += "<p>Failed: "+result.message[i]+"</p>";
                        }
                        $(form).before(html);
                    } 
                }); //end $.getJSON

             return false;
        });
    });
</script>

<body>
    <form id="new_client" action="/add_client" method="get">
    <!-- NOTE: we need to use method="get" for getJSON -->
        <input type="text" name="first_name" placeholder="Client first name">
        <input type="text" name="last_name" placeholder="Client last name">
        <input type="text" name="email" placeholder="Client email">
        <button type="submit">Add Client</button>
    </form>
</body>

这是我的 Nodejs 代码 (server.js) 的一部分:

var http = require('http');
var url = require('url');
var path = require('path');
var fs = require('fs');
var querystring = require('querystring');
var mysql = require('mysql');
var events = require('events');
var Validator = require('validator').Validator;
var eventEmitter = new events.EventEmitter();

var db = mysql.createConnection({
   //host:'localhost',
   port: 8889,
   user: 'root',
   password: 'root',
   database: 'test_database'
});

server = http.createServer(function (request, response){
var pageUrl = url.parse(request.url).pathname;

if(pageUrl === '/add_client'){
    var dataQuery = url.parse(request.url).query;
    var formData = querystring.parse(dataQuery);

    //set up event listener for 'add client result'
    eventEmitter.on('addClientResult', function (result){
        response.end(JSON.stringify(result));
    });

        //set up listener for existing client check
        eventEmitter.on('clientIsNewResult', function (result){
            if (result.success === false){
            response.end(JSON.stringify(result));
            }
            else {
                //this will trigger the 'addClientResult' event
                addClient(db, formData.first_name, formData.last_name, formData.email);
            }
        });

        //set up event listener for validated data
        eventEmitter.on('validateDataResult', function (result){
            if (result.success === false)
                response.end(JSON.stringify(result));
            else{
                //trigger 'clientIsNewResult' event
                clientIsNew(db, formData.email);
            }
        });

        // trigger the validateDataResult event
        validateData(formData.first_name, formData.last_name, formData.email);

    } //end 'add_client'
    else { ... code for other actions and where we start the response object... }
}); //end of server object

server.listen(8080);

function clientIsNew(db, email){
    db.query('SELECT * FROM clients WHERE email=?', [email],
        function (errors, results, fields) {
            if (errors) throw errors;

                //console.log(this.sql);
                if (results.length > 0){
                    query_result = {
                        'success': false,
                        'message': ['There is already a client with this email address!']
                }
            }
            else {
                query_result = {
                    'success': true,
                    'message': 'This is a unique user'
                };
            }

            eventEmitter.emit('clientIsNewResult', query_result);
    });
}
function addClient(db, first_name, last_name, email){
    //the only time we should get here is when we want to create a new user
    //so we should only get here when 'clientIsNewResult' is triggered and gets
    // a result of true... at least that is the intention!
    db.query('INSERT INTO clients SET first_name=?, last_name=?, email=?, created_at=NOW();',
        [first_name, last_name, email],
        function (errors, results, fields) {
            if (errors) throw errors;

            //console.log(this.sql);
            insert_result = {
                'success': true,
                'message': 'Client is added'
            }

            eventEmitter.emit('addClientResult', insert_result);
        }
    );
}

function validateData(first_name, last_name, email){
... validates info, no problems with this ...

    eventEmitter.emit('validateDataResult', result);
}

console.log('Server running at http://localhost:8080/');

好吧,我希望这不是太多,我也删除了很多评论和其他 console.log 行。

如果我需要发布更多或更少内容,或者我是否忘记了某些内容,请告诉我。

预先感谢您的帮助!

最佳答案

将事件发射器移至 http 请求内部

移动

var eventEmitter = new events.EventEmitter();

server = http.createServer(function (request, response){
var pageUrl = url.parse(request.url).pathname;
var eventEmitter = new events.EventEmitter();

关于html - Node.js 存储以前的表单数据,并在每次提交新数据时重新运行以前的 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17955577/

相关文章:

javascript - 在可拖动对象上时如何将光标样式设置为 'moveable'

html - 删除并重新添加 CSS 属性会更改元素的位置

mysql错误内连接

javascript: 需要 ('events' ).EventEmitter;

node.js - Heroku Node 应用程序不断崩溃

html - 如何在 ionicframework 中显示图像标题?

html - 如果我使用 flexbox,如何在列表上保留 h 标题?

android - 相关对象中带有 LIKE 子句的 GreenDao 查询

php - 将 ajax 结果显示到文本框中

javascript - 错误: Can't wait without a fiber