req.body没有给出这个名字

时间:2016-03-09 05:01:03

标签: javascript html node.js express

我使用第三方插件(多个和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);

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

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');

我做错了什么?

2 个答案:

答案 0 :(得分:0)

由于您使用的是数值<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

我从name删除了option属性,因为它没有执行任何操作(您已经为select标记定义了name

您应该只在定义了代码时执行此操作,从不将不受信任的用户输入作为html代码插入!

答案 1 :(得分:0)

这来自express

生成的express-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对POST进行/users/questions来电,并将您的数据作为JSON传递,那么您将获得该数据,因为我只是将其作为回复进行吐出。不要忘记在请求标头中设置Content-Type: application/json。对于文件上传,您可以尝试multerbusboy

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