Express中使用变量调用MongoDB失败,字面量调用正常
问题分析与解决办法
嘿,我一眼就看出你踩了个常见的小坑——这是数据类型不匹配导致的!
你说req.params.number能拿到预期值4,但用它查询就返回空,换成字面量4就正常?那是因为req.params里的所有参数默认都是字符串类型的,而你MongoDB里的number字段存的是数值类型(比如整数4)。MongoDB会严格匹配类型,字符串"4"和数值4在它眼里完全是两回事,自然查不到结果啦。
先验证下这个问题
你可以在代码里加两行日志确认类型,一测一个准:
console.log(typeof req.params.number); // 输出肯定是 "string" console.log(typeof 4); // 输出是 "number"
解决办法很简单:把字符串转成数值
有几种常用的转换方式,选你顺手的就行:
- 用
parseInt()转成整数(推荐,还能指定进制避免意外):
const targetNumber = parseInt(req.params.number, 10); await collection.find({ "number": targetNumber }).toArray(function(err, docs) { res.send(docs); });
- 用
Number()直接转换:
const targetNumber = Number(req.params.number); await collection.find({ "number": targetNumber }).toArray(function(err, docs) { res.send(docs); });
- 甚至可以用一元加号快速转换:
await collection.find({ "number": +req.params.number }).toArray(function(err, docs) { res.send(docs); });
顺带提个代码优化建议
你的代码里混合了async/await和回调函数,其实可以统一用async/await让代码更清爽,还能更好地处理错误:
.get('/getdata/:number', async (req, res) => { let client; try { client = await MongoClient.connect(url, {useNewUrlParser: true}); const collection = client.db('practice').collection('test'); const targetNumber = parseInt(req.params.number, 10); const docs = await collection.find({ "number": targetNumber }).toArray(); res.send(docs); } catch (err) { debug(err.stack); res.status(500).send('服务器出现错误啦'); } finally { if (client) { await client.close(); } } })
这样既解决了查询问题,代码可读性也提升了,还能在出错时给客户端一个明确的响应,不会让人家傻等~
内容的提问来源于stack exchange,提问作者JohanLarsson
相关产品推荐
相关产品推荐

