【问题标题】:Saving user information in MySql with NodeJs使用 NodeJs 在 MySql 中保存用户信息
【发布时间】:2017-09-05 19:20:27
【问题描述】:

我想制作一个注册表单。按下“提交”按钮后,脚本会打开我的 MySql 数据库并在“用户”表中插入一个新行。 一切正常,除了浏览器无法解释 NodeJs require 函数。 其他一些帖子说要使用 browserify,但我想知道这是否可以在没有其他程序的情况下完成。

我的代码:

register.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title></title>
<script src = "index.js" type="text/javascript"></script>
<script src = "register.js" type = "text/javascript"></script>

<link rel="stylesheet" type="text/css" href = "register.css">
</head>

<body>
<form name = "registerForm" method = "post">
<p id = "fillRule">Username must contain lower or uppercase or _! Fill in all boxes except the job! Pass must contain small and uppercase letters and its lenght must be at least 6 char, max 10!</p>
<label for="username">Username:</label>
<input type = "text" id = "username" name = "username" onchange = "checkUser()"> <br/>
<label for="firstname">Firstname:</label>
<input type = "text" id = "firstname" name = "firstame" onchange = "checkFirst()"> <br/>
<label for="lastname">Lastname:</label>
<input type = "text" id = "lastname" name = "lastname" onchange = "checkLast()"> <br/>
<label for="job">Your job:</label>
<input type = "text" id = "job" name = "job" onchange="checkJob()"> <br/>
<label for="pass">Password:</label>
<input type = "text" id = "pass" name = "pass" onchange = "checkPass()">        <br/>
<label for="mail">E-mail:</label>
<input type = "email" id = "mail" name = "mail" onchange = "checkMail()"> <br/>
<input type = "button" value = "send" id = "gomb" disabled = "disabled"   onclick = "registerButtonClick()">
</form>
</body>

</html>

index.js

    //export {addUser};

    // String formatting
    if (!String.format) {
    String.format = function(format) {
        var args = Array.prototype.slice.call(arguments, 1);
        return format.replace(/{(\d+)}/g, function(match, number) {
            return typeof args[number] != 'undefined'
                ? args[number]
                : match
                ;
        });
    };
}
//

var mysql = require("mysql");

function createConnection(hostName, userName, passwd, db)
{
    const con = mysql.createConnection({
        host: hostName,
        user: userName,
        password: passwd,
        database: db
    });
    return con;
}

 function openConnection(con)
{
    con.connect(function (err) {
        if (err) {
            console.log('Error connecting to Db');
            return;
        }
        console.log('Connection established');
    });
}

function executeFullSelect(con, tableName)
{
    const statement = "SELECT * FROM " + tableName + ";";
    con.query(statement, function(err, rows)
    {
        if (err)
        {
            throw err;
        }
        console.log("Data received from " + tableName + ".\n");
        console.log(rows);
        /*for (var i = 0; i < rows.length; i++)
        {
            console.log(rows[i].UserName);
        }*/
    });
}

function insert(con, userName,firstName, lastName, job, mail, passwd)
{
    const statement = String.format("call newUser(\"{0}\", \"{1}\", \"{2}\", \"{3}\", \"{4}\", \"{5}\");", userName, firstName, lastName, job, mail, passwd);
    con.query(statement, function(err, rows)
    {
        if (err)
        {
            console.log("Error at insert");
            return 0;
        }

        console.log(userName + " was successfully added:)");
        return 1;
    })
}

function closeConnection(con)
{
    con.end(function (err) {});
}

function addUser(userName, firstName, lastName, job, mail ,passwd)
{
    const con = createConnection("localhost", "root", "micimacko", "users");
    openConnection(con);
    if (!insert(con, userName, firstName, lastName, job, mail ,passwd))
    {
        closeConnection(con);
        return 0;
    }
    closeConnection(con);
    return 1;
}

register.js

function registerButtonClick()
{
    const userName = document.forms["registerForm"]["username"].value;
    const firstName = document.forms["registerForm"]["firstname"].value;
    const lastName = document.forms["registerForm"]["lastname"].value;
    const job = document.forms["registerForm"]["job"].value;
    const mail = document.forms["registerForm"]["mail"].value;
    const pass = document.forms["registerForm"]["pass"].value;

    if (addUser(userName, firstName, lastName, job, mail, pass))
    {
        alert("added");
    }
    else
    {
        alert("failed");
    }
}

【问题讨论】:

  • 为什么要在网页中包含服务器端代码?
  • 那是我的问题。我该怎么做才正确?
  • 通过在 node.js 中运行 node.js 代码,而不是尝试将其包含在网页中。它们是完全不同的东西。您是否将 node.js 设置为服务器?
  • @SamiKuhmonen,现在是 2017 年,今天没有人真正知道哪些 JavaScript 代码应该放在哪里。 ;)

标签: javascript html mysql node.js web


【解决方案1】:

您无法直接从浏览器连接到 MySQL 数据库。 Node 是浏览器中 Javascript 解释器的一个独立环境,它在服务器中运行,您应该在那里连接到数据库。使用 node 创建 HTTP 服务器相当容易:

var http = require('http');
var port = 3000;

const requestHandler = function (request, response) {  
 console.log(request.url)
 response.end('Hello Node.js Server!');
};

const server = http.createServer(requestHandler);

server.listen(port, function (err) {  
  if (err) {
    return console.log('something bad happened', err)
  }
  console.log('server is listening on ' + port);
});

但是,您必须直接手动处理路由(根据 URL 中请求的路径执行不同的操作), 所以我建议你阅读一些 Node 的 Web 框架,例如 Expressjs⁽¹⁾。

在 Express 中,您可以执行以下操作:

var express = require('express');
var app = express();

app.get('/hello', function (req, res) {
  res.send('Hello');
});

app.get('/world', function (req, res) {
  res.send('World');
});

app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
});

哪个会给你@987654321@@987654322@,一个返回“Hello”,另一个返回“World”。

浏览器和服务器之间的通信可以使用AJAX。我建议你使用 fetch,⁽²⁾ 但你也可以使用jQuery.ajax⁽³⁾,或者其他任何解决方案,甚至直接调用浏览器的XMLHttpRequest。⁽⁴⁾

⁽¹⁾https://expressjs.com

⁽²⁾ Fetch 是浏览器中 Web 请求的新标准,您已经可以通过这个 polyfill 使用它:https://github.com/github/fetch

⁽³⁾http://api.jquery.com/jquery.ajax/

⁽⁴⁾http://youmightnotneedjquery.com/#ajax

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    相关资源
    最近更新 更多