ExpressJS:POST后忽略响应

时间:2015-10-13 21:21:54

标签: node.js mongodb express

我正在尝试使用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>

1 个答案:

答案 0 :(得分:0)

  

客户端是否可以在POST后重定向?

是的,是的。

根据评论,您将从端点获取正确的呈现页面。这是一个正确的行为。你只需要在页面的某处插入响应html。