jQuery $ .post和$ .ajax POST请求不适用于Express

时间:2016-01-14 23:00:39

标签: javascript jquery ajax node.js express

我需要将数据从Express应用程序的前端发送到后端,然后使用需要显示该数据的EJS呈现页面。

问题app.post()方法,当我通过{{发出“手动”POST请求时,res.render()函数似乎无法完全或正确执行1}}或$.post

假设我通过JQuery发出此POST请求

$.ajax

或通过AJAX发出此POST请求

$.post("/test", {
  testData: 'Some test data.'
});

我配置我的app.post()方法来处理Express

中的路由

$.ajax({
  type: 'POST',
  data: {
    testData: 'Some test data here.'
  }),
  url: '/test',
 })

变量testData将通过app.post()方法发送和接收。所以说如果我这样做:app.post('/test', function(req, res) { res.render('./test.ejs', { testMessage: req.body.testData }); });,输出将是console.log(req.body.testData),所以那里没有问题。

问题在于Some test data功能,如果res.render()请求是通过POST或通过AJAX $.post完成的,则根本不起作用。 res.render()函数不会通过$.ajax$.post发出的POST请求执行或呈现页面。

奇怪的是,如果通过表单执行相同的$.ajax请求(我不想在我的应用程序中执行,因为POST请求不应该发送从输入接收的数据),在Express中 EXACT 相同的POST路由处理程序可以很好地工作。

例如,使用类似下面的表单可以使用app.post()显示页面,而res.render()$.post()方法则不然。为什么会这样?

$.ajax

我发现StackOverflow上的另一个问题与我的非常相似,但除了表单选项(我不能使用)之外没有明确的解决方法:Express.js Won't Render in Post Action

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

使用Ajax的意思是HTTP响应返回到JavaScript 并且不会替换整个页面。

如果要加载新页面,请不要使用Ajax。使用表格。

如果你想在JavaScript中处理响应,那么你需要为它添加一个处理程序。

let firstSwitch = XCUIApplication().switches.elementBoundByIndex(0)
_ = self.expectationForPredicate(
  NSPredicate(format: "self.value = %@", enabled),
  evaluatedWithObject: firstSwitch,
  handler: nil)
self.waitForExpectationsWithTimeout(15.0, handler: nil)

答案 1 :(得分:1)

正如其他人所指出的,jQuery .post,.ajax等不期望重定向,它期望JSON,所以这不起作用。但是,您可以通过一些简单的JavaScript获得您正在寻找的效果。这就是我遇到类似问题时的表现:

首先,我创建了一个URL字符串,将我想要传递给服务器的数据附加为查询参数

var urlString = 'http://hostaddress/myRoute?data1='+myData1+'data2='myData2;

其次,我这样做了一个window.location.replace:

window.location.replace(urlString);

第三,我在Express中制定了一条GET路由来处理传入的请求:

app.get('/myRoute', function(req,res){
var myData1 = req.query.data1;
var myData2 = req.query.data2;
res.render('myView',{data1:myData1,data2:myData2});

希望有所帮助。

答案 2 :(得分:0)

我遇到了同样的问题,并在不使用$ .post或$ .ajax的情况下解决了这个问题。首先,我从表单元素中取出了按钮:

<form id="form-test" role="form" action="/test" method="post">
<input type="text" name="testData" placeholder="Test Data Goes Here">class="form-control" required>
</form>
<button class="btn" type="submit">Submit</button>

我将发布表单条件绑定到单击按钮事件。我也可以发布我想要的价值。例如:

$(".btn").click(function(){
   if($(".form-control").val() ){
        $(".form-control").val("Desired Value");
        $("#form-test").submit();
   }else
        alert("TestData is empty");
});