如果这个nodejs rest api没问题并且它的mongoose结构和mongodb数据,为啥我从mongoDB得到空值?
Posted
技术标签:
【中文标题】如果这个nodejs rest api没问题并且它的mongoose结构和mongodb数据,为啥我从mongoDB得到空值?【英文标题】:Why am I getting empty value from mongoDB if this nodejs rest api is ok and its mongoose structure and mongodb data?如果这个nodejs rest api没问题并且它的mongoose结构和mongodb数据,为什么我从mongoDB得到空值? 【发布时间】:2019-07-02 19:00:58 【问题描述】:此 API 获取一个请求参数,该参数被过滤并传递给 User mongoose 模型,如下面的代码所示,正在查询 mongodb 并返回空值。如果一切正常,为什么会发生这种情况?
routes.route('/user')
.get( (req,res) =>
//const query = req.query;
//const query = req;
const query = req;
if (req.query.UserName)
query.UserName = req.query.UserName;
console.log("ok 2 " + query.UserName);
User.find(UserName:query.UserName, (err, data)=>
if (err)
console.log("not ok");
return res.send(err);
else
console.log("ok: " + data);
return res.json(data);
);
);
为了测试我的 API,我使用 postman 或 webbrowser 使用这个 URL: http://localhost:4000/api/user?UserName=smed
查看日志,可以看到打印的参数和数据也是空值。
这是猫鼬模型:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
let UserSchema = new Schema(
UserId:
type: Number
,
PersonId:
type: Number
,
UserName:
type: String,
unique: true
,
Deactivated:
type: Boolean
,
Password:
type: String
,
SysCreationDate:
type: Date
,
LastLoginDate:
type: Date
,collection:'User');
module.exports = mongoose.model('User', UserSchema);
还有mongo中的数据:
"_id":"$oid":"5d1037acde2b6feb37938db6","User":["UserId":
"$numberInt":"1","PersonId":"$numberInt":"1","UserName":"smed","Deactivated":false,"Password":"1234","SysCreationDate":"2016-06-23T21:42:31+07:00","UserId":"$numberInt":"2","PersonId":"$numberInt":"2","UserName":"eper","Deactivated":false,"Password":"1234","SysCreationDate":"2016-06-23T22:42:31+07:00"]
我已经在 Windows 10 和 Ubuntu 18.x.x 机器上对此进行了测试,我得到了同样的错误。 这些是我的依赖项:
"dependencies":
"body-parser": "^1.19.0",
"cors": "^2.8.5",
"express": "^4.17.1",
"mongoose": "^5.6.2"
和 NodeJS:v8.10.0
响应是 json 中的空数组。它应该查询 User 集合并返回 UserName 属性为“smed”时包含的对象,该参数在请求中发送: http://localhost:4000/api/user?UserName=smed
当 UserName=smed 时,它应该返回 mongo 数据(如前所示)
"_id":"$oid":"5d1037acde2b6feb37938db6","User":["UserId":"$numberInt":"1","PersonId":"$numberInt":"1","UserName":"smed","Deactivated":false,"Password":"1234","SysCreationDate":"2016-06-23T21:42:31+07:00"]
【问题讨论】:
如果find
无法找到文档,它不会出错,因此您看到您的搜索查询格式不正确,因此它不匹配任何文档。查看您发布的文档:用户名不是***字段
谢谢,但是 UserName 是集合 User 的属性之一,所以它不在第二级,因为它没有嵌套在另一个属性上。
【参考方案1】:
好像你做错了查询,试试下面的代码:
routes.route('/user').get((req, res) =>
const query = (req.query.userName) ?
User:
$elemMatch:
$eq: req.query.userName
: ;
User.find(query, (err, data) =>
if (err)
console.log("Error is: ", err);
return res.send(err);
else
console.log("Data is: " + data);
return res.json(data);
);
);
或使用 es6 异步/等待:
routes.route('/user').get(async (req, res) =>
try
const query = (req.query.userName) ?
User:
$elemMatch:
$eq: req.query.userName
: ;
const data = await User.find(query).lean();
console.log("Data is: " + data);
return res.json(data);
catch (err)
console.log("Error is: ", err);
return res.send(err);
);
希望这会有所帮助:)
【讨论】:
我没有得到任何数据:( 你能分享你的收藏架构吗? 当然,这里是链接(mongoDB 中的用户结构和用户数据以及将参数查询到数据库中的函数):drive.google.com/drive/folders/… 你的集合中的数据结构和你的架构不一样。你是怎么插入这些数据的?? 集合和模式有什么区别? (它们写得很准确,照顾每个属性的每个大写/小写)。关于我如何插入数据?我使用 mongoimport 将它们插入到我在 json 文件中创建的域数据中,这就是导入到数据库中的数据。以上是关于如果这个nodejs rest api没问题并且它的mongoose结构和mongodb数据,为啥我从mongoDB得到空值?的主要内容,如果未能解决你的问题,请参考以下文章
使用nodejs+ harbor rest api 进行容器镜像迁移
Nodejs Rest API 与 mongoose 和 mongoDB