mongoDB 数据库暴露在 /api,我该如何隐藏它?
mongoDB database exposed on /api, how do I hide this?
我正在使用 mongoDB 数据库、Vue、axios、caddy 服务器和 nodejs。
我遵循了这个教程:
https://www.youtube.com/watch?v=ek50iuo5zkE&ab_channel=DesignCourse
这导致我的整个数据库在 JSON 示例中公开。com/api。例如,页面的第一行可以是:
[{"_id":"6168115af6bfc986c18f821d","name":"test","age":"20","__v":0},
它列出了整个数据库。我该如何隐藏它?
我的 app.js 文件,在教程中是:
let express = require('express'),
cors = require('cors'),
mongoose = require('mongoose'),
database = require('./database'),
bodyParser = require('body-parser');
//connect mongoDB
mongoose.Promise = global.Promise;
mongoose.connect(database.db, {
useNewUrlParser: true,
useUnifiedTopology: true
}).then(() => {
console.log("Database connected")
},
error => {
console.log("Database couldn't be connected to: " + error);
}
)
const cryptoEndPoint = require('../backend/routes/crypto.route')
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: false
}));
app.use(cors())
//API
app.use('/api', cryptoEndPoint)
//create port
const port = process.env.PORT || 4000;
const server = app.listen(port, () => {
console.log('Connected to port ' + port);
})
//Find 404
app.use((req, res, next) => {
next(createError(404));
})
//error handler
app.use(function (err, req, res, next) {
console.log(err.message);
if (!err.statusCode) err.statusCode = 500;
res.status(err.statusCode).send(err.message);
})
.env.development 文件:
VUE_APP_BASE_API_URL=http://localhost:4000/api
.env.production 文件:
VUE_APP_BASE_API_URL=https://example.com/api
database.js 文件:
module.exports = {
db: process.env.MONGO_CONNECTION_URI
}
我认为这可能是球童(服务器)问题,但我在他们的论坛上发帖,他们说这是节点问题,并且“你应该 reverse_proxying 到你的 NodeJS 应用程序,而不是你的数据库。”我的印象是我的球童服务器已经这样做了,我的球童文件是:
example.com {
handle /api* {
reverse_proxy localhost:4000
}
handle {
root * /var/www/html
try_files {path} /index.html
file_server
}
}
根据教程,我还有crypto.route.js:
const express = require('express');
const cryptoRoute = express.Router();
let CryptoModel = require('../models/Crypto');
cryptoRoute.route('/').get((req, res) => {
CryptoModel.find((error, data) => {
if (error) {
return next(error)
} else {
res.json(data)
}
})
})
cryptoRoute.route('/add-crypto').post((req, res, next) => {
CryptoModel.create(req.body, (error, data) => {
if (error) {
return next(error)
} else {
res.json(data)
}
})
})
Crypto.js:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
let cryptoSchema = new Schema({
name: {
type: String
}
}, {
collection: 'sentences_nouns'
})
module.exports = mongoose.model('Crypto', cryptoSchema);
cryptoRoute.route('/').get((req, res) => {
CryptoModel.find((error, data) => {
...
GET
在您的 /api
路线上 returns 您的整个数据库,因为您没有在 get
方法中使用任何查询。避免它的最简单方法是向端点添加一些参数,例如/api/:id
,然后获取该参数并放入查询
cryptoRoute.route('/:id').get((req, res) => {
const urlId = req.params.id
CryptoModel.find({ id: urlId }, (error, data) => {
...
我建议阅读 routing in express and queries in mongoose
您是说要隐藏文档的某些属性吗?
如果是这样你应该在猫鼬中使用投影
并指定您想要的字段。
cryptoRoute.route('/').get((req, res) => {
CryptoModel.find((error, data) => {
if (error) {
return next(error)
} else {
res.json(data.projection({ name: 1 }))
}
})
})
所以在这个片段中,我们只选择名称字段
关注这个link:“projection in mongoose”
mongodb
我在回答我自己的问题:
几个月前我还不明白怎么解释,结果发现我需要对用户进行身份验证。
我现在按照这个简单的指南使用 Firebase 身份验证:
https://fireship.io/snippets/express-middleware-auth-token-firebase/
我正在使用 mongoDB 数据库、Vue、axios、caddy 服务器和 nodejs。
我遵循了这个教程: https://www.youtube.com/watch?v=ek50iuo5zkE&ab_channel=DesignCourse 这导致我的整个数据库在 JSON 示例中公开。com/api。例如,页面的第一行可以是:
[{"_id":"6168115af6bfc986c18f821d","name":"test","age":"20","__v":0},
它列出了整个数据库。我该如何隐藏它?
我的 app.js 文件,在教程中是:
let express = require('express'),
cors = require('cors'),
mongoose = require('mongoose'),
database = require('./database'),
bodyParser = require('body-parser');
//connect mongoDB
mongoose.Promise = global.Promise;
mongoose.connect(database.db, {
useNewUrlParser: true,
useUnifiedTopology: true
}).then(() => {
console.log("Database connected")
},
error => {
console.log("Database couldn't be connected to: " + error);
}
)
const cryptoEndPoint = require('../backend/routes/crypto.route')
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: false
}));
app.use(cors())
//API
app.use('/api', cryptoEndPoint)
//create port
const port = process.env.PORT || 4000;
const server = app.listen(port, () => {
console.log('Connected to port ' + port);
})
//Find 404
app.use((req, res, next) => {
next(createError(404));
})
//error handler
app.use(function (err, req, res, next) {
console.log(err.message);
if (!err.statusCode) err.statusCode = 500;
res.status(err.statusCode).send(err.message);
})
.env.development 文件:
VUE_APP_BASE_API_URL=http://localhost:4000/api
.env.production 文件:
VUE_APP_BASE_API_URL=https://example.com/api
database.js 文件:
module.exports = {
db: process.env.MONGO_CONNECTION_URI
}
我认为这可能是球童(服务器)问题,但我在他们的论坛上发帖,他们说这是节点问题,并且“你应该 reverse_proxying 到你的 NodeJS 应用程序,而不是你的数据库。”我的印象是我的球童服务器已经这样做了,我的球童文件是:
example.com {
handle /api* {
reverse_proxy localhost:4000
}
handle {
root * /var/www/html
try_files {path} /index.html
file_server
}
}
根据教程,我还有crypto.route.js:
const express = require('express');
const cryptoRoute = express.Router();
let CryptoModel = require('../models/Crypto');
cryptoRoute.route('/').get((req, res) => {
CryptoModel.find((error, data) => {
if (error) {
return next(error)
} else {
res.json(data)
}
})
})
cryptoRoute.route('/add-crypto').post((req, res, next) => {
CryptoModel.create(req.body, (error, data) => {
if (error) {
return next(error)
} else {
res.json(data)
}
})
})
Crypto.js:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
let cryptoSchema = new Schema({
name: {
type: String
}
}, {
collection: 'sentences_nouns'
})
module.exports = mongoose.model('Crypto', cryptoSchema);
cryptoRoute.route('/').get((req, res) => {
CryptoModel.find((error, data) => {
...
GET
在您的 /api
路线上 returns 您的整个数据库,因为您没有在 get
方法中使用任何查询。避免它的最简单方法是向端点添加一些参数,例如/api/:id
,然后获取该参数并放入查询
cryptoRoute.route('/:id').get((req, res) => {
const urlId = req.params.id
CryptoModel.find({ id: urlId }, (error, data) => {
...
我建议阅读 routing in express and queries in mongoose
您是说要隐藏文档的某些属性吗? 如果是这样你应该在猫鼬中使用投影 并指定您想要的字段。
cryptoRoute.route('/').get((req, res) => {
CryptoModel.find((error, data) => {
if (error) {
return next(error)
} else {
res.json(data.projection({ name: 1 }))
}
})
})
所以在这个片段中,我们只选择名称字段
关注这个link:“projection in mongoose” mongodb
我在回答我自己的问题:
几个月前我还不明白怎么解释,结果发现我需要对用户进行身份验证。
我现在按照这个简单的指南使用 Firebase 身份验证: https://fireship.io/snippets/express-middleware-auth-token-firebase/