如何使用 Express 和 Node.js 从表单发送参数

Posted

技术标签:

【中文标题】如何使用 Express 和 Node.js 从表单发送参数【英文标题】:How to send parameters from a form using Express and Node.js 【发布时间】:2019-08-27 14:52:21 【问题描述】:

对不起英文,我是巴西人,我不知道怎么写。

我正在尝试使用 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来存储任务,而且我在端口3306上使用wampp,但是当我提交表单时出现错误:

未找到

在此服务器上找不到请求的 URL /MetaSite/public/insert。

Apache/2.4.35 (Win64) PHP/7.2.10 服务器在 localhost 端口 80

index.html 在 public 文件夹中,app.js 在 src 中。

谁能帮帮我?我不知道我做错了什么。谢谢你。

【问题讨论】:

您发布到 apache 服务器,而不是 express 应用程序。此外,操作应该是:/insert 而不是 MetaSite/public/insert 您的“选择”路线有效吗?它的网址是什么? @MarcosCasagrande 是在正确的轨道上,我想。但是,您的 api 在不同的端口上。您需要在操作中指定带有端口的完整 URL,如 here 所述 【参考方案1】:

根据您的代码,您的 index.html 似乎不是由服务器 javascript 托管的。为了使 express 能够处理来自该文件的 post 请求,该文件需要由 express 引用和托管。如果这是您正在做的事情,而您只是没有在代码中显示它,请告诉我,否则,这看起来像是您的问题。你应该这样做的方式是:

var path = require('path');

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

将索引文件托管在http://localhost:3000/。

【讨论】:

这是不准确的。 HTML 可以独立于 API 托管,并且通常在云部署中。这无疑会使 XSRF 技术复杂化,但原帖并没有使用它们。 是的,但是只使用表单操作而不提及另一个服务器,例如使用 axios,除非 html 和 javascript 在同一台服务器上,否则将无法正常工作。 action方法采用完整的URL,完全可以跨域发帖。 ***.com/questions/11423682/cross-domain-form-posting。 在 JS 中发布(例如,使用 axios)时,您可能会遇到问题(由于跨域策略) 正确,这个程序可以做到这一点,但它正在使用它吗?不,它没有提到另一台服务器,它所做的只是使用表单操作。前端没有提到另一台服务器。因此,它正在尝试向它所在的服务器创建一个发布请求,并且不与服务器 javascript 共享。 正确。我只是不会说,“你必须在 express 中托管 html”。您可以在 express 中托管 html,它会解决这个问题。您也可以简单地更改表单操作。如果在单独的应用程序中托管静态 HTML 是经过深思熟虑的选择(就像我在 Amazon S3 部署中所做的那样),那么表单操作可以指向另一个域和/或端口。

以上是关于如何使用 Express 和 Node.js 从表单发送参数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Node.js、Express 和 Mongoose 进行身份验证?

如何使用 Express 和 Node.js 从表单发送参数

node.js 和 express:如何等待 udp 响应

如何使用 node.js/express 中止请求?

如何使用 Express JS/Railway JS (Node.JS) 生成 JSON

会话如何在 Express.js 和 Node.js 中工作?