[英]Why am I getting empty value from mongoDB if this nodejs rest api is ok and its mongoose structure and mongodb data?
这个 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.xx 机器上测试过这个,我得到了同样的错误。 这些是我的依赖项:
"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"}]}
似乎您在做错误的查询,请尝试使用以下代码:
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 async/await:
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);
}
});
希望这可以帮助 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.