为什么我对PHP文件的Angular POST请求返回404?

时间:2017-05-11 03:50:18

标签: javascript php mysql angularjs http-status-code-404

我发布了index.htmlapp.jsinsert.php的代码。

安装的依赖项是 express mysql morgan

在我的文件夹中我有

  • / node_modules
  • app.js
  • 的index.html
  • insert.php
  • 的package.json

我在后台运行WAMP本地服务器。默认情况下,phpMyadmin的用户名为root,密码为空。我已经设置了一个名为storestuff的数据库,其中包含一个名为thestuff的表,其中有两列titlecontent

所以我在终端中运行node app.js然后得到
Server running on port 3000.
Connected successfully to the database

现在,我去访问 localhost:3000

页面加载时,终端会显示GET / 304 20.635 ms - -,表示页面已正确加载。

我还使用phpMyAdmin将一些虚拟数据插入到MySQL storestuff数据库中以进行测试。访问 localhost:3000 /加载 这是app.js中设置的路线,终端显示GET /load 200 16.382 ms - - 在浏览器中显示一个带有JSON数据的页面,它确实是我插入的虚拟数据,http代码200表示GET请求正常工作。

当我填写title字段和content字段并按提交时,终端会显示我不理解的POST /insert.php 404 2.949 ms - 150,因为insert.php位于同一文件夹中为index.html

的index.html

<html>
  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro">
  </head>

  <body>
    <font face="Source Sans Pro">
      <div ng-app="myApp" ng-controller="myController">
        <h1> Hello world! </h1>
        <form>
          Title <input type="text" ng-model="title"><br>
          Content <input type="text" ng-model="content"><br>
          <input type="button" value="Submit" ng-click="insertdata()">
        </form>
        <script>
          var app = angular.module('myApp', []);
          app.controller('myController', function($scope, $http) {
            $scope.insertdata = function() {
              $http.post('insert.php', {
                'title':$scope.title,
                'content':$scope.content
              })
              .then(function(data) {
                console.log("Data inserted into the MySQL database successfully.");
              });
            }
          });
        </script>
      </div>
    </font>
  </body>
</html>


app.js

var express = require('express');
var mysql = require('mysql');
var morgan = require('morgan');
var app = express();
app.use(morgan('dev'));

var connection = mysql.createConnection({
    host : 'localhost',
    user : 'root',
    password : '',
    database : 'storestuff'
});

connection.connect(function(error) {
    if(error) console.log("Problem connecting to MySQL: " + error);
    else console.log("Connected successfully to the database");
});

app.get('/', function(req, res) {
    res.sendFile(__dirname + '/index.html');
});

app.get('/load', function(req, res) {
    connection.query("SELECT * from thestuff", function(err, rows) {
        if(err) console.log("SELECT from thestuff... did not work: " + err);
        else res.end(JSON.stringify(rows));
    });
});

app.listen(3000, function() {
    console.log("Server running on port 3000.");
});


insert.php

<?php
  $data = json.decode(file_get_content('php://input'));
  $title = mysql_real_escape_string($data->title);
  $content = mysql_real_escape_string($data->content);
  mysql_connect('localhost', 'root', '');
  mysql_select_db('storestuff');
  mysql_query("INSERT INTO thestuff('title', 'content') VALUES('".$title"', '".$content"')");
?>

3 个答案:

答案 0 :(得分:1)

将其添加到php文件的顶部

RewriteEngine on
RewriteRule ^(.*) http://server/node/myname/$1 [P]

答案 1 :(得分:1)

尝试标题属性

$http({
      method: 'POST',
      url: 'insert.php',
      data: {'whetever':'data', 'in':'json format'},
      headers: {'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'}
    })
    .then(function(res){
         console.log('successful response', res);
    .catch(function(err) { 
         console.error('Error while post', err);
    });

您可以访问 insert.php

header("Access-Control-Allow-Origin: *");

if ($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST)) {
    $_POST = json_decode(file_get_contents('php://input'), true);    
    echo $data->whatever;
  }

注意:您还可以在.config块中为所有发布请求全局设置,如下所示

myApp.config(function($httpProvider) {
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
});

答案 2 :(得分:0)

您正在使用节点为Web服务器供电。一些事情:在您的应用程序路由中,您没有app.post('/insert.php')的路由,这是您404的原因。但是node.js本身不会为您解释php文件,所以最好它会显示php文件的代码。您可以使用插件或在express / nodejs前使用其他Web服务器,如nginx。