Node.js Mongoose populate()返回空数组

Node.js Mongoose populate()返回空数组,node.js,mongodb,mongoose,mongoose-populate,subdocument,Node.js,Mongodb,Mongoose,Mongoose Populate,Subdocument,我想通过clientSchema中的属性“token”查询子文档数组。但是我无法填充子文档数组。它总是返回空值 这就是我所尝试的 var performAuthAsync = promise.promisify(performAuth); var response = {}; performAuthAsync(req).then(function (client) { sendStatus(res, 200, { "success": "true", "value": client

我想通过clientSchema中的属性“token”查询子文档数组。但是我无法填充子文档数组。它总是返回空值

这就是我所尝试的

var performAuthAsync = promise.promisify(performAuth);

var response = {};
performAuthAsync(req).then(function (client) {

    sendStatus(res, 200, { "success": "true", "value": client });

}).catch(ApiError, function (e) {
    response.error = "true";
    response.message = e.message;
    if (e.message == "Invalid Authorization" || e.message == "Unauthorized access") {
        console.log(e.message);
        sendStatus(res, 401, response, req.query.type);
    }
    else {
        sendStatus(res, 500, response, req.query.type);
    }

});
性能法

function performAuth(req, callback) {
try {
    var authHeader = req.headers.authorization;
    console.log(authHeader);
    //error in req format
    if (!authHeader || !authHeader.startsWith("Basic ")) {
        console.log("inside fail authheader");
        return callback(new ApiError("Invalid Authorization"));
    }

    authHeader = authHeader.replace("Basic ", "");
    authHeader = Buffer.from(authHeader, 'base64').toString('ascii');

    console.log(authHeader);

    //temporary populate check
    clientApp.findOne({}).populate({

            path: 'appClients',
            model: 'TClient'

    }).exec(function (error, apps) {
        console.log("populated apps check " + apps); //object containing empty array

       //{ _id: 5987099f2cb916a0de80f067,
       //  appSecret: 'THisIsSecret',
       //  appId: 'W5ikGw16dQjgWm8bGjqdAwi1IDR2XibD3XESYokH',
       //  appClients: [] }

       // mongo console output
       // { "_id" : ObjectId ("5987099f2cb916a0de80f067"), 
       // "appSecret" : "THisIsSecret", 
       // "appId" : "W5ikGw16dQjgWm8bGjqdAwi1IDR2XibD3XESYokH", 
       // "appClients" : [ ObjectId("59881a64dbab536016e7f970") ], "__v" : 0 }
    });

    clientApp.findOne({}).populate('appClients').findOne({
        'appClients.token': authHeader
    }).exec(function (error, client) {

        if (error) {
            console.log("inside dberror");
            console.error(error);
            return callback(error, null);
        }

        if (!client) {
            return callback(new ApiError("Unauthorized access"), null);
        }

        return callback(client);

    });
}
catch (exception) {
    console.log("inside exception");
    console.error(exception);
    return callback(exception, null);
}

}
Clientapp和客户端架构:(它们位于不同的文件中)

我做错了什么?感谢您的帮助函数
findOne()
只返回一个文档。之后,populate方法填充子文档值。但是下一个
findOne()
不起作用,因此会得到
null
响应

您可以尝试以下方法:

异步函数performAuth(){
让authHeader=authHeader.replace(“基本”和“”);
authHeader=Buffer.from(authHeader'base64')。toString('ascii');
const clientApp=wait clientApp.find({})
.populate('AppClient'))
.map(data=>data.find(item=>item.appClients.token==authHeader).exec();
}
执行的操作

  • 得到所有的客户

  • 填充AppClient

  • 查找其标记与authHeader匹配的clientApp


  • 您能否检查
    临时填充检查中是否存在任何
    错误
    。@tolse错误为null。您声明findOne返回“空数组”,而findOne应始终返回一个对象!!findOne返回包含空数组的对象。我更新了question@Tolsee我还更新了mongo控制台输出
    
    var appSchema = new Schema({
        appId: {
            type: String,
            required: true,
            unique: true
        },
        appSecret: {
            type: String,
            required: true,
            unique: true
        },
        appClients: [{ type: Schema.Types.ObjectId, ref: 'TClient' }],
        createdAt: Date,
        modifiedAt: Date
    });
    
    // model
    var clientApp = mongoose.model('ClientApp', appSchema);
    
    
    var clientSchema = new Schema({
        clientId: {
            type: String,
            required: true,
            unique: true
        },
        info: {
            type: String,
            required: true,
        },
        token: {
            type: String,
            required: true,
            unique: true
        },
        createdAt: Date,
        modifiedAt: Date
    });
    
    // model
    var tclient = mongoose.model('TClient', clientSchema);