Mongoose populate()返回空数组

时间:2017-08-07 06:59:34

标签: node.js mongodb mongoose mongoose-populate subdocument

我想通过属性'令牌'来查询子文档数组。在clientSchema中。但是我无法填充子文档数组。它总是返回空值。

这就是我试过的

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);
    }

});

PerformAuth方法

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和客户端架构:(它们位于不同的文件中)

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);

我做错了什么?任何帮助表示赞赏

1 个答案:

答案 0 :(得分:0)

findOne()函数仅返回一个文档。之后,填充方法将填充子文档值。但是下一个findOne()不起作用,因此您会收到null响应。

您可以尝试以下方法:

async function performAuth(){
    let authHeader = authHeader.replace("Basic ", "");
    authHeader = Buffer.from(authHeader, 'base64').toString('ascii');
    const clientApp = await clientApp.find({})
      .populate('appClients')
      .map(data => data.find(item=>item.appClients.token === authHeader).exec();
}

已执行的操作

  1. 获取所有clientApps

  2. 填充appClients

  3. 找到令牌与authHeader匹配的clientApp