req.body 没有给出这个名字

req.body does not give the name

本文关键字:body req      更新时间:2023-09-26

我使用第三方插件(多个和wmd编辑器)制作了一个表单。我的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);

我正在我的节点的路由文件中获取这些.js(快速框架)作为:

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

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

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

我在应用程序中的代码.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');

我做错了什么?

由于您使用的是数值<option value="+(index+1)+"这就是您得到的。

对于["foo","bar baz"],您的代码会产生:<option value=1 name=foo>foo</option><option value=2 name=bar baz>bar baz</option>

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

如果要将标记字符串用作值,请将其更改为

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

获取<option value="foo">foo</option><option value="bar baz">bar baz</option>,并在服务器上["foo", "bar baz"] req.body.tags

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

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

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

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。对于文件上传,您可以尝试 multer 或 busboy

有关body-parser的更多信息,请查看正文解析器