如果这个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得到空值?的主要内容,如果未能解决你的问题,请参考以下文章

电子中的 REST API [关闭]

PayPal REST API 更新计费协议

使用nodejs+ harbor rest api 进行容器镜像迁移

Nodejs Rest API 与 mongoose 和 mongoDB

如何使用 nodejs 创建 POST REST API? [复制]

NodeJS RESTful API - 如何正确处理“未定义”请求变量?