【问题标题】:How to retrieve the data from the POST in NODE JS如何在 NODE JS 中从 POST 中检索数据
【发布时间】:2014-11-15 15:33:45
【问题描述】:

这是我的 HTML 表单

<form class="navbar-form navbar-right" ng-submit="loginuser()">
                    <input type="email" ng-model="user.username" placeholder="Email" class="form-control" required>
                    <input type="password" ng-model="user.password" placeholder="Password" class="form-control" required>
                    <button class="btn btn-success" type="submit">Login</button>
</form>

我的 app.js 是

function navbarformcontroller($scope,$http){
    $scope.user = {};

    $scope.loginuser = function(){
        console.log('entered');
        $http({
            method : 'POST' ,
            url : 'http://localhost:3000/login',
            data : $scope.user
        })
            .success(function(data){
                alert(data);
            })
            .error(function(data, status){
                alert(data + " " + status + 'x');
            })
    };
}

在我的服务器端是节点 js

router.get('/', function(req, res) {
    req.render('login',{username : req.username, password : req.password});
    res.send('success');
    log(username + "   " + password);
});

并且错误详情在客户端控制台是

XMLHttpRequest 无法加载 http://localhost:3000/login。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问 Origin 'http://localhost:63342'。

【问题讨论】:

  • 不要在两个不同的端口上运行您的应用程序,否则您将成为SOP 的受害者...

标签: javascript node.js angularjs localhost


【解决方案1】:

您的浏览器正在限制对其他域的访问。您使用的是 localhost 但是不同的端口,这就是您的域变得不同的原因。

这里最好的解决方案是运行服务器并使用相同的端口请求访问。由于您在端口 63342 上运行 nodejs 服务器,因此您需要使用域访问 /login 页面

http://localhost:63342

更好的是,因为域是相同的,您可以避免添加域并将请求作为

function navbarformcontroller($scope,$http){
    $scope.user = {};

    $scope.loginuser = function(){
        console.log('entered');
        $http({
            method : 'POST' ,
            url : '/login',
            data : $scope.user
        })
            .success(function(data){
                alert(data);
            })
            .error(function(data, status){
                alert(data + " " + status + 'x');
            })
    };
}

【讨论】:

  • 实际上我创建了两个项目,一个用于客户端,另一个用于服务器端,这就是端口号不同的原因。有什么方法可以将 HTML 5 和 NODEJS 的组合项目创建为同一个项目,以便我可以在相同的端口号上运行?该项目已在 Webstorm 中创建
  • 你总是可以这样做....不需要有两个单独的文件夹....nodejs中有一个公共文件夹,您可以在其中拥有所有客户端文件,nodejs服务器可以提供这些文件给最终用户......视图也可以是任何模板语言......
【解决方案2】:

这里有几个问题:

  • 您似乎没有使用正文解析中间件。如果您不处理文件,您可能只使用 npm 上的 body-parser 模块。如果您需要multipart/form-data(文件)支持,body-parser 的自述文件中有指向可以处理这些类型请求的模块的链接。

  • 您正在尝试同时向客户端呈现模板字符串“success”。此外,对于模板渲染,它是 res.render() 而不是 req.render()

  • 您正在尝试跨域请求。虽然主机名可能相同,但端口不同,这也构成了跨域请求。因此,在 Express 中处理 CORS 的最简单方法之一是在 npm 上使用诸如 cors 之类的中间件。如果您需要在请求中发送 cookie、自定义标头等,则需要在您的 $http 配置对象中设置 withCredentials: true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多