Node.js Mongoose populate()返回空数组
我想通过clientSchema中的属性“token”查询子文档数组。但是我无法填充子文档数组。它总是返回空值 这就是我所尝试的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
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();
}
执行的操作
您能否检查
临时填充检查中是否存在任何错误。@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);