Node.js и express (MySQL): невозможно POST / и код 404 в браузере - PullRequest
0 голосов
/ 21 апреля 2020

Я только учусь, как создать простое веб-приложение для моего общежития, которое бы присваивало каждому участнику случайное число, когда они вводят свое имя. Есть поле формы с одним текстовым полем и кнопкой. Текстовое поле (форма) должно отправить полное имя (одну строку) в базу данных MySQL, чтобы позже я мог получить полный список с назначенными номерами, чтобы фактически использовать приложение в реальном мире. Просто для избыточности я вставил код, который каждый раз создает новую базу данных и таблицу, но затем SQL игнорирует ее, если БД и таблица уже существуют.

Моя фундаментальная проблема заключается в том, что я не могу получить данные из моей формы в HTML. Я использую express. js и пытаюсь получить его, а затем отправить в базу данных через модуль SQL. Теперь, когда я полный новичок ie, я понятия не имею, как это должно работать. Последние 4 дня я искал по всему inte rnet, чтобы попытаться решить эту проблему. Я не знаю, является ли документ js проблемой или документ HTML.

Это моя форма HTML (скажите, если вам понадобится все это):

<form action="/createPerson" method="POST">
                <input type="text" name="name" value="Ime in priimek">
                <input type="submit" name="name" value="Potrdi" class="gumbek">
            </form>

А вот мой полный node.js документ:

var mysql = require('mysql');
var express = require("express");
var bodyParser = require("body-parser");
var urlencodedParser = bodyParser.urlencoded({
  extended: false
});
const http = require('http');
var fs = require('fs');
const app = express();
const path = require('path');
const router = express.Router();

// Unique random number generator module
const uniqueRandom = require('unique-random');


app.use(express.static(__dirname + '/public'));
app.use(bodyParser.urlencoded({
  extended: false
}));
app.use(bodyParser.json());

server = http.createServer(app);
server.listen();

// Start connecting to MySQL database
var con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "root",
  database: "mydb"
});

//if database mydb exists, ignore database creation
let createMydb = "CREATE DATABASE if not exists mydb"
con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
  con.query(createMydb, function(err, result) {
    if (err) throw err, console.log("Database already exists!");
    console.log("Database OK (Already exists, will not create new one)");
  });
});

//if table person exists, ignore table creation
let createTable = "CREATE TABLE if not exists person (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), number VARCHAR(255))";
var sql = createTable;
con.query(sql, function(err, result) {
  if (err) throw err, console.log("Table exists, will not create new table");
  console.log("Table OK (Already exists, will not create new one)");

  console.log('Running at Port 3000');

  console.log("Connected. Commencing value input into database.");
  //var post = { name: req.body.name, number: random }
  //app.get('/createPerson', urlencodedParser, function(err, req, res) {
  if (err) throw err;
  //res(req.body.name)
});



router.get('/', function(req, res) {
  res.sendFile(path.join(__dirname + '/index.html'));
  //__dirname : It will resolve to your project folder.
});

/*const random = uniqueRandom(1, 100);
const values = ['/createPerson', String(random())];
var insert = "INSERT INTO person (name, number) VALUES (?)"
con.query(insert, [values], function(err, result) {
    if (err) throw err;
    console.log("Value was inserted into database.");
});*/


app.get('/createPerson', function(req, res) {
  res.render('form'); // if jade
  // You should use one of line depending on type of frontend you are with
  res.sendFile(__dirname + '/index.html'); //if html file is root directory
});




app.post('/createPerson', urlencodedParser, function(req, res) {
  const random = uniqueRandom(1, 100);
  const values = [String(req.body.name), String(random())];
  var insert = "INSERT INTO person (name, number) VALUES (?)"
  console.log(req.body.name);
  con.query(insert, [values], function(err, result) {
    if (err) throw err;
    console.log("Value was inserted into database.");
    res.sendFile(__dirname + '/numberAssigned.html');
    res.end();

  });

});

Теперь каждый раз, когда я нажимаю кнопку в форме, я получаю Cannot POST /createPerson внутри браузера, и данные не отправляются в мою базу данных. Браузер (вкладка сети) также дает мне 404. Может быть, он не может найти форму?

Я полный новичок ie при всем этом, я могу управлять HTML и CSS, Javascript это что-то действительно новое для меня. Если вы найдете время, чтобы помочь мне, СПАСИБО ИЗ НИЖНЕГО СЕРДЦА!

1 Ответ

0 голосов
/ 21 апреля 2020

Проблема в том, что вы используете node.js http module и express одновременно.

Вы настраиваете / createPerson внутри express. js, но вместо этого запускается http-сервер node.js. Таким образом, на сервере, который вы запустили, нет конечных точек, поэтому страница 404 не найдена.

Обычно вы используете только одну из них. Node.js Модуль http позволяет запускать низкоуровневый HTTP-сервер. Express, с другой стороны, является более высокоуровневым решением для построения http-сервисов. Так что в вашем случае я бы придерживался express и выбрасывал http (express в любом случае использует http-модуль под капотом).

Но фундаментальная проблема вашего решения заключается в том, что он слишком большой и от сложного до bootstrap с нуля.

Может быть очень сложно понять, что происходит в сложном приложении, поскольку вы пытаетесь сделать много вещей одновременно - express http server + sql база данных + html формы ... Многие вещи могут go ошибаться, поэтому лучше вместо этого попробуйте подход "Hello World".

Чтобы устранить подобную проблему, я бы уменьшил масштаб приложения и попытался бы проверять каждый маленький уровень взаимодействия по уровням:

Уровень 1

  1. Закомментируйте использование модуля http и каждое отображение в express, кроме POST для / createPerson
  2. Убедитесь, что вы запустили express app.listen () после установки конечной точки.
  3. Закомментируйте весь доступ к базе данных в обработчике / createPerson и оставьте только оператор журнала, подобный этому:
    app.post('/createPerson', urlencodedParser, function(req, res) {
        console.log(req.body.name);
    }
Теперь запустите ваш скрипт с node.js и попробуйте проверить POST на / createPerson с помощью curl:
    curl --data-urlencode "name=John Doe (Junior)" http://localhost:3000

(убедитесь, что вы используете правильный порт)

Проверьте node.js журналы - вы должны увидеть там имя, которое вы отправляете с curl.

Когда вы увидите имя в журналах, уровень 1 завершен!

Уровень 2

Теперь попробуйте сделать то же POST, но сформируйте HTML форму.

  1. Добавить статистику c сопоставление / publi c с node.js.

  2. Запустите сервер node.js.

  3. Откройте страницу с помощью HTML Форма и POST.

  4. Убедитесь, что ваша форма отправляет данные на правильный URL, и вы видите данные в node.js журналах

Уровень 3

Только теперь, когда данные передаются от html до node.js, вы можете попытаться расширить систему с помощью базы данных. Реинтегрируйте код доступа к БД обратно в / createPerson и отладьте решение.

Удачи на следующих уровнях!

...