Node.js如何将字符串作为MongoDB查询执行?db.eval报not a function如何解决
问题解决方案
报错根因
- MongoDB 3.0版本起已将
db.eval标记为废弃特性,4.2及以上版本直接移除了该功能,同时新版Node.js MongoDB驱动也删除了对应的API,因此调用时会抛出eval is not a function错误 db.eval本身存在严重的安全注入风险,官方早已明确不推荐生产环境使用,不建议继续基于该方法实现需求
推荐解决方案
优先使用JS对象动态拼接查询参数,不要拼接执行字符串,这种方式既安全又易维护,示例代码如下:
const { MongoClient } = require("mongodb"); const url = "someurl"; // 注意:原始代码存在重复声明mongoClient变量的错误,这里修正为变量名client const client = new MongoClient(url) async function run() { try { await client.connect(); const db = client.db("somedb"); // 以下参数都可以根据业务逻辑动态生成,不需要拼接字符串 const targetCollection = "somecollection"; // 动态集合名 const queryCondition = {}; // 动态查询条件,例如{status: 1, age: {$gt: 18}} const limitCount = 1; // 动态返回条数 const result = await db.collection(targetCollection) .find(queryCondition) .limit(limitCount) .toArray(); console.log(result); } catch(err) { console.log(err); } finally { await client.close(); } } run();
特殊场景替代方案(极度不推荐)
如果你确实有必须执行字符串格式查询的特殊场景,且使用的是MongoDB 4.2以下的旧版本,可以通过db.command调用底层eval命令实现,一定要做好输入校验避免注入攻击:
// 仅做功能演示,严禁在生产环境使用 async function run() { try { await client.connect(); const db = client.db("somedb"); const query = "db.getCollection('somecollection').find().limit(1)"; const evalResult = await db.command({ eval: `function(){ return ${query}.toArray(); }` }); console.log(evalResult.retval); } catch(err) { console.log(err); } finally { await client.close(); } }
内容的提问来源于stack exchange,提问作者Витязи Team
相关产品推荐
相关产品推荐

