Express POST在Apache上返回404

时间:2017-07-14 22:27:29

标签: node.js apache reactjs express post

有一个React应用程序明确要求Mongodb提供api /登录信息并检查密码输入,否则它不允许您访问该网站。

本地一切都很棒。当我们将所有构建文件移动到apache服务器时,控制台返回POST https://websitepath.com/api/login 404(未找到)

enter image description here

知道什么可能是一个问题,为什么它在本地工作,但不能在apache上工作?已安装节点,Express已在端口4000上成功运行。

这是index.js的代码

var express = require('express');
var bodyParser= require('body-parser')
var MongoClient = require('mongodb').MongoClient
var sha1 = require('sha1');
var db;

const PORT = 4000;
var app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));


app.use('/api/login', function (req, res) {

  if (!req.body.password) return res.status(400).send('bad_request!')

  db.collection('user').find().toArray(function(err, results) {
    if (err) return res.status(500).send('something_wrong!');

    var checker = false;

    results.forEach(function (entry) {
      if (entry.password === sha1(req.body.password)) checker = true;
    })

    if (checker) {
      res.send('success')
    } else {
      return res.status(403).send('Unfortunately password is incorrect. Please try again.');
    }
  })
})

MongoClient.connect('mongodb://localhost:27017/test', (err, database) => {
  if (err) return console.log(err)
  db = database
  app.listen(PORT, function() {
    console.log('Express server is up on port ' + PORT);
  });
})

以下是AuthService.js的代码

 import axios from 'axios';
import qs from 'qs';

const AuthService = {
  isLogged: false,
  login(data, cb) {

    axios.post('/api/login',  qs.stringify(data)).then(
      (res) => {
        this.isLogged = true;
        cb(null, res);
      }
    ).catch((error) => {
      console.error('error occured', error);
      cb(error.response.data);
    })
  },
}

export default AuthService;

1 个答案:

答案 0 :(得分:0)

您的问题并未提及代理node.js应用程序,因此我猜测问题所在 - 具体而言,节点应用程序未被代理。

简而言之,您似乎想要做的就是这样:

Apache正在侦听端口443(HTTPS端口)并以各种路径提供网页(可能是除/api以外的路径以外的所有内容。)

您希望Web服务器还在端口443上提供node.js API(例如/api/login和其他)使用的路径。

但是两个不同的应用程序(Apache和你的node.js应用程序)不能同时监听端口443 - Apache正在绑定它并提供自己的页面。如果您尝试更改node.js应用程序上的端口,它将无法启动并向您显示错误,指示端口443已被另一个应用程序绑定。

对此有一个简单的测试:导航到http://websitepath.com:4000/api/login。如果您可以看到您的API登录页面(即node.js应用程序正在侦听端口4000),这意味着问题不在于您的节点应用程序,而在于Apache的代理配置。

对此的解决方案是setting up Apache as a proxy。这将允许Apache提供自己的页面,并根据路径将请求转发给另一个服务。所以你当然可以设置它,以便以/api/...开头的路径被转发到http://localhost:4000/api/...,而任何其他路径都由Apache直接提供。

设置代理并不是非常困难,但这在很大程度上取决于您的具体情况,因此我不打算尝试解释所有的内容和内容。出局。我建议从mod_proxy文档开始。那里还有大约一百万个教程; Digital Ocean's documentation很好 - 我过去曾经使用过它。