【问题标题】:How to get data passed from a form in Express (Node.js)如何从 Express (Node.js) 中的表单获取数据
【发布时间】:2012-03-07 11:22:17
【问题描述】:

我想使用表单获取从页面传递的数据,并在重定向的页面中使用该数据。

我的客户端有这个表格:

<form action="game" method="get">
    <input type="text" name="name"/>
    <input type="submit" />
</form>

我的服务器中有这个脚本:

app.get('/game',function(req,res){
    res.sendfile(__dirname + '/game.html'); 
});

【问题讨论】:

  • 你使用method='get'而不是POST有什么原因吗?

标签: javascript node.js express


【解决方案1】:

重要提示:已弃用,accepted answer 是正确的解决方案。


为了让 express 能够很好地处理表单数据,您需要确保包含 bodyParser,如下所示:

var express = require('express'),
    app = express.createServer();

app.use(express.bodyParser());
//the rest of your configuration

然后在您的 POST 处理程序中,您可以通过 Request.body 属性访问表单正文,如下所示:

app.post('/game', function (req, res) {
    res.render('some-file', { name: req.body.name });
});

如果您打算在响应中输出表单数据,您还需要使用模板引擎(例如 Jade)。

【讨论】:

  • 如果我有玉,我如何访问客户端中的数据?
  • 如何获取名称变量?
  • @JudeCalimbas 这个解决方案对于POST 是正确的,但是你有GET 的问题。如果你改变它,你可以在req.body.name 中访问name,就像@Slace 在他的回答中所说的那样。
  • 此后已更改为:var express = require('express'); var bodyParser = require('body-parser'); var app = express(); app.use(bodyParser.json());
  • 不正确~解析表单数据需要bodyParser.urlencoded()
【解决方案2】:

如果您需要访问视图中的变量名称,您应该使用res.render 函数并传递变量,如下所示:

res.render('game', {
    name: req.body.name
}

然后在玉做

div!= name

【讨论】:

  • 如果你愿意,你也可以使用 ejs。或者可能读取 html 文件并替换名称的占位符
【解决方案3】:

使用bodyParser.urlencoded() 中间件:

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

然后表单值将在 req.body 上:

app.post('/game', function (req, res) {
    res.render('the_template', { name: req.body.name });
});

设置{ extended: true } 允许bodyParser 接受表单数据中的json 类数据,包括嵌套对象。例如{ person: { name: Adam } } 使用 javascript 发送,而不是传统 HTML 表单发送的名称值对。如果不需要,可以将扩展值设置为 false。不定义扩展选项(即使用默认设置)显然已被弃用,他们似乎希望您决定是否需要嵌套选项或纯名称值对。

如果您希望能够在 express 服务器中解析某些路由的表单数据和其他路由的 json 数据,您可以使用:

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: <true|false> }))

urlencoded() 用于 x-www-form-urlencoded 内容类型

  • true - 用于嵌套数据结构
  • false - 用于名称值对

json() - 用于应用程序/json 内容类型

注意form/multipart需要不同的body解析器(比如multer)

更新:修复 ExpressJS 关于 Body-Parser 被弃用的错误

替换

app.use(bodyparser.json()); //utilizes the body-parser package
app.use(bodyParser.urlencoded({extended: true}));

app.use(express.json()); // Used to parse JSON bodies
app.use(express.urlencoded()); //Parse URL-encoded bodies

【讨论】:

  • 为什么设置extended: true?我们期待收到什么特别的东西吗?
  • 你在这里有一个非常详细的答案:stackoverflow.com/questions/29175465/…
  • Bodyparser 似乎被标记为@Deprecated
【解决方案4】:

或者您可以简单地使用 express 来执行此操作:

   const express = require('express')
   const app = express()

   app.use(express.json()) // for json
   app.use(express.urlencoded({ extended: true })) // for form data

【讨论】:

  • 这是正确答案。不再需要 bodyparser 库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
  • 2021-02-16
  • 2021-08-15
  • 2014-12-08
相关资源
最近更新 更多