无法使用MongoDB Atlas数据库:无find权限及路径疑问
问题解决:MongoServerError: user is not allowed to do action [find] on [product.book]
这个错误和你的API路径(/book还是/books)无关,核心原因是你在MongoDB Atlas中配置的数据库用户,没有对product数据库下的book集合执行find操作的权限。
解决步骤:
- 登录MongoDB Atlas控制台,进入你的
cluster0集群 - 点击左侧菜单栏的「Database Access」(数据库访问)
- 找到代码中
DB_USER对应的用户,点击右侧的「Edit」按钮 - 在「Database User Privileges」区域,配置合适的权限:
- 开发环境可以直接选择「Read and write to any database」权限,快速解决
- 生产环境建议精细化授权:点击「Add Privilege」,选择「Built-in Role」中的
read,然后指定数据库为product
- 保存修改,等待1-2分钟让权限生效
额外确认:
- 你的代码中集合名称是
book,错误提示里明确指向product.book,说明集合名称是匹配的,不需要改成books - API路径
/book是自定义的路由,和数据库集合名称没有强制关联,如果你想改成/books只是命名风格问题,不影响当前报错的解决
你的代码:
const express = require('express'); const cors = require('cors'); require('dotenv').config(); const port = process.env.PORT || 5000; const app = express(); const { MongoClient, ServerApiVersion } = require('mongodb'); // midlewarwe app.use(cors()); app.use(express.json()); const uri = `mongodb+srv://${process.env.DB_USER}:${process.env.DB_PASS}@cluster0.ibawcfn.mongodb.net/?retryWrites=true&w=majority`; const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1, }); async function run() { try { await client.connect(); const bookCollection = client.db('product').collection('book'); app.get('/book', async (req, res) => { const query = {}; const cursor = bookCollection.find(query); const books = await cursor.toArray(); res.send(books); }); // app.post('/books', async (req, res) => { // const newBook = req.body; // const result = await bookCollection.insertOne(newBook); // res.send(result); // }); } finally { } } run().catch(console.dir); app.get('/', (req, res) => { res.send('hello world '); }); app.listen(port, () => { console.log('listening on port ', port); });
内容的提问来源于stack exchange,提问作者Rafsan Ahmed Raj
相关产品推荐
相关产品推荐

