[英]Express POST returns 404 on Apache
有一个React应用程序可以向Mongodb明确请求api / login信息,并对照它检查密码输入,否则,您将无法访问该网站。
在本地,一切正常。 当我们将所有构建文件移至apache服务器时,控制台将返回POST https://websitepath.com/api/login 404(未找到)
关于什么可能是问题以及为什么它在本地有效但在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;
您的问题没有提到代理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的代理配置。
解决方案是将Apache设置为代理 。 这将允许Apache服务于其自己的页面,并根据路径将请求转发至另一服务。 因此,您当然可以进行设置,以便将以/api/...
开头的路径转发到http://localhost:4000/api/...
而其他任何路径都由Apache直接提供。
设置代理并不十分困难,但这在很大程度上取决于您的具体情况,因此,我不会尝试解释所有的来龙去脉。 我建议从mod_proxy文档开始。 还有大约一百万个教程。 Digital Ocean的文档很好-我过去曾经使用过。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.