Как отправить параметры из формы с помощью Express и Node.js

Извините за английский, я бразилец и не умею хорошо писать.

Я пытаюсь отправить по почте данные формы с помощью Express:

index.html

<form action="insert" method="post">
            <p><h4> Title </h4>   <input type="text" name="title" id="title" size="40" maxlength="30" placeholder="Name of task"/> </p> 

            <p><h4>Description</h4> <textarea name="description" id="description" cols="50" rows="3" placeholder="description of task"></textarea> </p> 

            <p> 
                <h4>Grade</h4>
                <input type="radio" name="urgency" value="2"> 2
                <input type="radio" name="urgency" value="1" checked> 1
                <input type="radio" name="urgency" value="0"> 0
            </p>

            <p> 
                <h4>How?</h4>
                <select name="taskType" id="select"> 
                    <option value="2"> N* </option> 
                    <option value="1"> Hour </option> 
                    <option value="0"> Minute </option> 
                </select>
                <input type="text" name="repeats" id="options" size="40" maxlength="5" placeholder="NX?"/> </p> 
            </p>

            <p><button type="submit"> Submit </button></p>
        </form>

app.js

const express = require('express');
const bodyParser = require('body-parser');
const mysql = require('mysql');
const app = express();
app.use(bodyParser.urlencoded({ extended: true }))


const db = mysql.createConnection({
        host     : 'localhost',
        user     : 'root',
        password : '',
        database : 'metas'
});

db.connect( (err)  => {
        if(err) throw err;
        console.log('MySQL conected...');
});

app.get('/select', (req, res) => {
        let sql = "SELECT * FROM tasks";
        db.query(sql, (err, result) => {
                if(err) throw err;
                res.send(result);
        })
})

app.post('/insert', (req, res) => {
        let post = 
                {title: req.body.title, 
                description: req.body.description, 
                grau: req.body.urgency, 
                tipoRealizacao: req.body.taskType, 
                repeticoes: req.body.repeats
                }
        let sql = 'INSERT INTO tasks SET ?';
        let query = db.query(sql, post, (err, result) => {
                if(err) throw err;
                res.send("Post added");
        })
})


app.listen('3000', () => { console.log("Server initiated") } );

Я использую mysql для хранения задач, более того, я использую wampp на порту 3306, но когда я отправляю форму, у меня возникает ошибка:

Не найдено

Запрошенный URL-адрес /MetaSite/public/insert не найден на этом сервере.

Сервер Apache/2.4.35 (Win64) PHP/7.2.10 на локальном хосте, порт 80

index.html находится в общей папке, а app.js — в src.

Кто-нибудь может мне помочь? Я не знаю, что я делаю неправильно. Спасибо.


person Jefferson Rodrigues    schedule 05.04.2019    source источник
comment
Вы отправляете сообщение на сервер Apache вместо экспресс-приложения. также действие должно быть: /insert вместо MetaSite/public/insert   -  person Marcos Casagrande    schedule 05.04.2019
comment
Ваш выбранный маршрут работает? Какой у него URL?   -  person ChiralMichael    schedule 05.04.2019
comment
@MarcosCasagrande, я думаю, на правильном пути. Однако ваш API находится на другом порту. Вам необходимо указать полный URL-адрес с портом в вашем действии, как указано здесь   -  person ChiralMichael    schedule 05.04.2019


Ответы (1)


Судя по вашему коду, не похоже, что ваш index.html размещается на сервере javascript. Чтобы экспресс мог обрабатывать запросы на публикацию из этого файла, на этот файл необходимо ссылаться и размещать экспресс. Если это то, что вы делаете, и вы просто не показываете это в своем коде, сообщите мне, но в остальном это похоже на вашу проблему. Вот как это сделать:

var path = require('path');

app.get('/', function(req, res) {
    res.sendFile(path.join(__dirname + 'public/index.html'));
});

для размещения индексного файла по адресу http://localhost:3000/.

person gegs921    schedule 05.04.2019
comment
Это неверно. HTML может размещаться отдельно от API и часто размещается в облачных средах. Это, несомненно, усложнит методы XSRF, но в опубликованном оригинале они все равно не используются. - person ChiralMichael; 05.04.2019
comment
Да, но простое использование действия формы без упоминания другого сервера, как с axios, не будет работать, если html и javascript не находятся на одном сервере. - person gegs921; 05.04.2019
comment
Правильно, эта программа на это способна, но использует ли она это? Нет. Он не упоминает другой сервер, все, что он делает, это использует действие формы. Во внешнем интерфейсе нет упоминания о другом сервере. Следовательно, он пытается создать почтовый запрос на сервер, на котором он уже находится, и не передает серверу javascript. - person gegs921; 05.04.2019
comment
Правильный. Я бы просто не сказал, что вы должны размещать html в экспрессе. Вы можете разместить html в Express, и это решит проблему. Вы также можете просто изменить действие формы. Если размещение статического HTML в отдельном приложении является преднамеренным выбором (как я сделал бы при развертывании Amazon S3), то действие формы может указывать на другой домен и/или порт. - person ChiralMichael; 05.04.2019
comment
Я просматриваю это снова, и присутствие публики на пути заставляет меня думать, что это не может быть преднамеренным выбором. Я готов поспорить, что есть экземпляр Apache, который с радостью обслуживает весь серверный код. Я хотел бы увидеть результат GET /MetaSite/src/app.js. Вероятно, есть более серьезные проблемы. Возможно, открыт только /public, но корень сайта все равно смонтирован неправильно. - person ChiralMichael; 05.04.2019