有一个React应用程序明确要求Mongodb提供api /登录信息并检查密码输入,否则它不允许您访问该网站。
本地一切都很棒。当我们将所有构建文件移动到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;
答案 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很好 - 我过去曾经使用过它。