【问题标题】:req.body does not give the namereq.body 没有给出名字
【发布时间】:2016-03-09 05:01:02
【问题描述】:

我使用 3rd 方插件(multiple 和 wmd-editor)制作了一个表单。 我的 HTML 是:

<form id="form" class="form" method="post" action="/questions">
    <div id="title" class="form__title">
        <div id="question_title">Title</div>
        <input id="input_element1" class="input_element" type="text" placeholder="What's your programming question? Be specific." name="title">
    </div>
    <div class="text-area">
        <div id="wmd-button-bar"></div>
        <br/>
        <textarea id="wmd-input" name="text"></textarea>
        <div id="wmd-preview"></div>
        <br/>
    </div>
    <div class="inputtags form__tags">
        <select id="options" multiple="multiple" name="tags">
        </select>
        <div class="inputtags__element"></div>
        <div class="inputtags__errors"></div>
        <br>
        <div id="inputtags__post">
            <button class="btn" id="btn-submit">
                Post Your Question
            </button>
            <button class="btn" id="btn-discard">
                Discard
            </button>
        </div>
    </div>
</form>

我正在使用 javascript 在选项中添加标签,而 javaScript 代码是:

var index = -1;
var htmlStr = tags.reduce(function(a,b){
    index++;
    return a + "<option value="+(index+1)+" name="+b+">"+b+"</option>"; 
},'');
$("#options").html(htmlStr);

我在我的 node.js(express 框架)的路由文件中获取这些:

router.post('/questions', function(req,res){
    var question = req.body;
    console.log(question);
    Question.createQuestion(question);
    res.redirect('/');
});

这里 req.body 应该按照expressjs Documentation 的建议给我 DOM 的名称。我已经在我的 javascript 代码中为我的选项命名,但是当数据被推送到数据库时,req.body 会返回以下内容:

{
    title: 'title',
    text: '<p>Body</p>',
    tags: [ '1', '2', '3', '4', '5', '6', '7', '8' ]
}

我在 app.js 中的代码:

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
var mongoose = require('mongoose');
var passport = require('passport');
var flash = require('connect-flash');

我做错了什么?

【问题讨论】:

  • 当您使用express(假设它)时,您是否需要body-parserformidablemulter(其中任何一个)从post/put 请求中提取正文?更多github.com/expressjs/body-parser默认不加在express 4中
  • @nmrony 我确实需要 body-parser。
  • 你的中间件配置顺序是什么?
  • @nmrony我怎样才能得到它?我是节点的新手。

标签: javascript html node.js express


【解决方案1】:

由于您使用的是数值&lt;option value="+(index+1)+",这就是您所得到的。

对于["foo","bar baz"],您的代码生成:&lt;option value=1 name=foo&gt;foo&lt;/option&gt;&lt;option value=2 name=bar baz&gt;bar baz&lt;/option&gt;

这是非常糟糕的 html 代码,将发送 12 作为值。

如果您想使用标签字符串作为值,请将其更改为

return a + "<option value=\"" + b + "\">" + b + "</option>";

在服务器上获取&lt;option value="foo"&gt;foo&lt;/option&gt;&lt;option value="bar baz"&gt;bar baz&lt;/option&gt;["foo", "bar baz"] 作为req.body.tags

我从option 中删除了name 属性,因为它不执行任何操作(您已经为选择标记定义了name)。

只有在定义了标签,从不将不受信任的用户输入作为 html 代码插入时,您才应该这样做!

【讨论】:

  • 你刷新页面了吗?使用开发工具检查您的浏览器发布的内容:stackoverflow.com/a/9163566/3173842 如果您的浏览器将标签发布为 [1,2,3... 这是客户端问题。
【解决方案2】:

这是来自expressexpress-generator 生成的样板的一部分

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.text());
//rest of the code

user路由器文件中

var express = require('express');
var router = express.Router();

router.post('/questions', function(req, res) {
    res.status(200).json(req.body);
});

如果您使用 POSTMAN 对/users/questions 进行POST 调用并将您的数据作为JSON 传递,您将得到它,因为我只是将它作为响应吐出。不要忘记在请求头中设置Content-Type: application/json。对于文件上传,您可以尝试multerbusboy

有关body-parser的更多信息,请查看body-parser

【讨论】:

    猜你喜欢
    • 2022-07-23
    • 2018-12-31
    • 2017-11-24
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    相关资源
    最近更新 更多