我使用第三方插件(多个和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');
我做错了什么?
答案 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代码,会将1
和2
作为值发送。
如果要将标记字符串用作值,请将其更改为
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
。对于文件上传,您可以尝试multer或busboy
有关body-parser
的更多信息,请查看body-parser