使用AngularJS客户端将POST表单数据发送到Express/Node.js服务器

3

我正在尝试从一个AngularJS表单中读取数据并将其发送到Express服务器。我的客户端函数可以发送数据,但请求从未到达服务器。我认为URL存在问题。

AngularJS控制器中相关部分:

$scope.loginUser = function() {
   $scope.statusMsg = 'Sending data to server...';
   $http({
      url: 'http://##.##.##.##/login.js', // IP address replaced with ##'s
      method: 'POST',
      data: user,
      headers: {'Content-Type': 'application/json'}
})

这段代码会被执行,因为我从第一行看到了消息。 url 是我的 Express 服务器的绝对路径。这个 URL 应该是什么?(它需要指向某个现有文件吗?)

我的Express服务器相应部分(login.js在同一个目录下):

var express = require("express");
var bodyParser = require("body-parser");
var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.post('*', function(req, res) {
   console.log('Processing request...');
   res.sendFile('/success.html');
});

app.listen(3000);

我执行了这个服务器,并且它在应该监听的3000端口上工作。但是当我的客户端执行时,上面的app.post方法从未运行,因为我从未在控制台上看到处理请求...输出。这里的路径应该是什么?它需要与客户端中的URL一致吗?
问题是什么?我认为总体结构是正确的,但路径/ URL 应该是什么?(即,不仅仅是上述情况的值,而是它们的语义。在线文档没有说明这一点。)
如果有帮助的话,我的 HTML 表单使用 method="post" 且未指定action。 我已经调整了这些和许多其他设置,但没有运气。
4个回答

3

答案是列出的答案的组合。

  1. 不要在URL中列出Express服务器的扩展名。
  2. 在IP地址后:3000立即包含端口号。

AngularJS客户端:

url: 'http://##.##.##.##:3000/login'

Express服务器路由:

 app.post('/login', function(req, res) {
     console.log('Processing request...');
     res.sendFile('/success.html');
 });

我也发现我的Amazon Web Services实例的安全组在端口3000上阻止了入站流量。我将该端口对外开放后,应用程序正常工作了。


1
只需使用'/login',不要使用完整路径。

$scope.loginUser = function() {
   $scope.statusMsg = 'Sending data to server...';
   $http({
      url: '/login', // No need of IP address
      method: 'POST',
      data: user,
      headers: {'Content-Type': 'application/json'}
})


如果我这样做,客户端会收到响应,但发送的数据是服务器login.js的整个代码,因此服务器永远不会处理请求。我只是想将数据发送到服务器并让其在该数据上运行。你知道怎么做吗? - thatWiseGuy

0
尝试在$http中使用“params”而不是“data”,无论头部是“application/x-www-form-urlencoded”还是“application/json”,但使用“json”它将在NodeJS上捕获“req.query.param1”。它对我有用,希望能帮到你。

0
如果我们查看您的login.js文件中的代码,那么很明显它将从控制台运行。 node login.js 这将创建服务器实例来响应任何post请求。请更改URL
$scope.loginUser = function() {
   $scope.statusMsg = 'Sending data to server...';
   $http({
      url: 'http://##.##.##.##:3000', //Your url will be like this.
      method: 'POST',
      data: user,
      headers: {'Content-Type': 'application/json'}
});

仍然不起作用。如果我包括端口,即使nmap显示端口3000已经打开,它也会超时。如果未指定端口,则返回给客户端的数据是服务器login.js代码,因此服务器永远不会收到请求。为什么POST请求不能通过3000端口发送到服务器?我正在使用Firefox的RESTClient进行测试,但没有响应。 - thatWiseGuy
我可能找到了问题所在。在同一台服务器上使用 nmap 显示端口 3000 是开放的,但从另一台机器上该端口没有列出。那么我该如何使这个端口对外开放呢?我的 Express 服务器确实在监听这个端口。 - thatWiseGuy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接