2016-03-09 46 views
0

我已经使用第三方插件(多重和wmd编辑器)做了一个表单。 我的HTML是:req.body没有给出名称

<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的途径获取文件这些(快递框架)为:

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

这里req.body应该给我的DOM的名称作为expressjs Documentation建议。我已经在我的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'); 

我做错了什么?

+0

你需要'身体parser','formidable'或'multer'(任何人)从'后提取体/ put'请求,当你使用'express'(假设它)?它不会被添加到默认快速4更多https://github.com/expressjs/body-parser –

+0

@nmrony我确实需要身体分析器。 –

+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在服务器上。

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

时,才应这样做,如果你定义的标签,从未插入不可信的用户输入的HTML代码!

+0

但它仍然无法正常工作。 –

+0

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

0

这是从express样板。如果你做一个POST调用/users/questions使用邮递员,传递您的数据JSONexpress-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); 
}); 

产生的一部分你会得到它,因为我只是吐出它作为回应。不要忘记在请求头中设置Content-Type: application/json。对于文件上传你可以尝试multerbusboy

更多关于body-parserbody-parser