我正在尝试将字符串推入数组中,以查找由其ID找到的数据库条目。这是put方法本身:
app.put('/todo/:id', urlencodedParser, function(req, res) {
Todo.findByIdAndUpdate({_id:ObjectId(req.params.id)},
{ "$push": { "item": req.body } },
{ "new": true, "upsert": true },
function (err, data) {
if (err) throw err;
console.log("test");
}
); });
问题是,日志永远不会打印到控制台,这让我觉得这个方法实际上并没有被调用。我假设它与前端部分有关,我在按钮提交时调用put方法,然后?:
$('form').on('submit', function(){
var item = $('form input');
var todo = {item: item.val()};
$.ajax({
type: 'PUT',
url: '/todo/' + id,
data: todo,
success: function(data){
location.reload();
}
});
return false;
});
行为方面,当我点击提交按钮时,文本框会清除(应该如此),并将网址更改为:
/todo/59bd48905a2ed911e0d480f2?item=item+to+be+inserted
在控制台中登录没有错误。我哪里错了?
E:
这里也是我的架构:
var todoSchema = new mongoose.Schema({
item: [String]
});
这里的Url编码解析器:
var bodyParser = require('body-parser');
var urlencodedParser = bodyParser.urlencoded({extended: false});
答案 0 :(得分:2)
好的,所以在前端代码中你需要添加preventDefault,而你还没有定义id
变量。所以这应该有效:
$('form').on('submit', function (event) {
event.preventDefault()
var item = $('form input')
var todo = {item: item.val()}
var path = window.location.pathname.split('/')
var id = path[2]
console.log(id)
$.ajax({
type: 'PUT',
url: '/todo/' + id,
data: todo,
success: function (data) {
// do something with the data via front-end framework
location.reload()
}
})
return false
})
在服务器中,无需字符串化req.body.item
:
app.put('/todo/:id', urlencodedParser, function (req, res) {
console.log(req.body)
Todo.findByIdAndUpdate(req.params.id,
{ '$push': { 'item': req.body.item } },
{ 'new': true, 'upsert': true },
function (err, data) {
if (err) throw err
console.log('here')
res.end()
}
)
})