我正在尝试使用NodeJS,Express和Mongo制作我的第一个REST API。我已经完成了大部分代码 - 我可以使用GET从数据库中获取数据并使用POST写入它。但是,由于某种原因,POST回调中的响应参数似乎完全被忽略。我试过调用res.render([工作模板]),res.end(),res.send()等等,代码似乎跳过了响应,就像它不存在一样。没有错误,只是没有做任何事情。我也尝试将POST URI更改为其他内容,例如/ api / projectsave,以防路由以某种方式相互干扰,但这没有帮助。
编辑:如果切换到res.json(),JQuery代码中的Success回调会运行。 (感谢@Molda。)但是,原始问题仍然存在,因为响应对象不会使用res.render()呈现任何内容。那是为什么?
以下是相关代码(在我的API控制器中):
app.get('/api/project/:id', function(req, res) {
Project.find({id: req.params.id}, function(err, projects) {
if (err) throw err;
if (projects.length > 0) {
res.json(projects);
} else {
res.render('form');
}
});
});
app.post('/api/project', jsonParser, function(req, res, next) {
res.render('index'); // Here's the line that doesn't do anything.
console.log("Body: " + util.inspect(req.body, false, null)); // This line gets run.
var item = Project(req.body);
item.save(function(err) {
if (err) throw err; // And this save to the db works fine.
console.log('Project saved with id ' + req.body.id + '.');
res.render('index'); // Doesn't work down here, either.
})
});
app.get('/api/project', function(req, res) {
res.render('form');
});
和表单(它是一个Jade模板,但这里是呈现的HTML):
<form id="form" name="add-project" method="POST" action="/api/project">
<div class="input">
<label for="id">ID</label>
<input type="text" name="id" id="id">
</div>
<div class="input">
<label for="name">Name</label>
<input type="text" name="name" id="name">
</div>
<div class="input">
<label for="desc">Description</label>
<input type="text" name="desc" id="desc">
</div>
<div class="actions">
<input type="submit" value="Add Project">
</div>
</form>
<script>
$.fn.serializeObject = function()
{
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name]) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
$("form").submit(function(event) {
event.preventDefault();
var jsonData = JSON.stringify($(this).serializeObject());
$.ajax({
type: "POST",
url: '/api/project',
contentType: 'application/json',
dataType: 'json',
data: jsonData,
success: function(data) {
// This callback does successfully run
alert("Success: " + data);
},
failure: function(err) {
alert("Failed: " + err);
}
});
});
</script>
答案 0 :(得分:0)
客户端是否可以在POST后重定向?
是的,是的。
根据评论,您将从端点获取正确的呈现页面。这是一个正确的行为。你只需要在页面的某处插入响应html。