好吧,昨晚我发布了一个问题,因为我对方法调用获得混合回报感到沮丧;我得到了一个有效的答案,但我感到困惑,因为这是我在问题发生前所做的事情。
这个问题在这里:javascript undefined, when I just logged it 正如你所知,我正在“关键”回来......它只是在一个物体和一系列物体之间波动。
今晚 - 我坐下来恢复,现在我甚至无法从“findKey”电话中取回KEY。 (从昨晚发行链上一步)。
目标是兑换优惠券。 用户将URL中的KEY传递给api,这将是 1)按键查找记录,返回id和用户ID(发给'Coupon'的人) 2)如果优惠券未被兑换,则会标记已重新兑换的优惠券 3)并与有问题的用户做其他事情。
我没有收到错误,但“KEY”始终未定义
mongoDB Atlas - mongooseJS 4.9.8 - 节点8.9.1 - 表达4.15.5 键是128个字符UID - 如果这对猫鼬有影响,我已经尝试了5个字符键并得到相同的'没有结果' 所以我认为这不是问题所在。
我在Mongo IDE中获得了一个结果。记录就在那里......
兑换优惠券的路线
router.get('/:_key', (req,res) => {
CouponKey.findKey( req.params._key, (err, key) => {
if ( key !== undefined ) { // sadly this was working last night -
console.log( 'yea ---' + key );
} else { // now this is all i get
console.log('ha ha --- ' + req.params._key );
}
});
})
以上结果如下:
--- module.exports.findKey --- zzc6a
ha ha --- zzc6a
MODEL CouponKey
const CouponKeySchema = new Schema({
key: {
type: String
,required: true
}
,type: {
type: String
,required: true
}
,user_id: {
type: mongoose.Schema.ObjectId
,required: true
}
,date: {
issued: {
type: Date
,default: Date.now
}
,redeemed: {
type: Date
,default: null
}
}
}, {collection:'coupons_keys',strict:false } );
const CouponKey = module.exports = mongoose.model('CouponKey', CouponKeySchema);
module.exports.findKey = function( key, callback ) {
console.log('--- module.exports.findKey --- ' + key );
const query = { key: key };
CouponKey.find(query, callback);
}
我试过这个
const query = { key: key };
x = UserKey.find(query);
console.log(x);
输出是这个(我没有看到'返回记录')
Query {
_mongooseOptions: {},
mongooseCollection:
NativeCollection {
collection: Collection { s: [Object] },
opts: { bufferCommands: true, capped: false },
name: 'coupons_keys',
collectionName: 'coupons_keys',
conn:
NativeConnection {
... },
queue: [],
buffer: false,
emitter:
EventEmitter {
domain: null,
_events: {},
_eventsCount: 0,
_maxListeners: undefined } },
model:
{ [Function: model]
hooks: Kareem { _pres: {}, _posts: {} },
base:
Mongoose {
connections: [Array],
plugins: [],
models: [Object],
modelSchemas: [Object],
options: [Object] },
modelName: 'CouponKey',
model: [Function: model],
db:
NativeConnection {
... },
discriminators: undefined,
schema:
Schema {
obj: [Object],
paths: [Object],
subpaths: {},
virtuals: [Object],
singleNestedPaths: {},
nested: [Object],
inherits: {},
callQueue: [Array],
_indexes: [],
methods: {},
statics: {},
tree: [Object],
query: {},
childSchemas: [],
_plugins: [Object],
s: [Object],
options: [Object],
'$globalPluginsApplied': true },
collection:
NativeCollection {
collection: [Object],
opts: [Object],
name: 'coupons_keys',
collectionName: 'coupons_keys',
conn: [Object],
queue: [],
buffer: false,
emitter: [Object] },
Query: { [Function] base: [Object] },
'$__insertMany': [Function],
insertMany: [Function],
setKey: [Function],
findKey: [Function],
findKeyByCouponId: [Function],
redeem: [Function] },
schema:
Schema {
obj:
{ key: [Object],
type: [Object],
coupon_id: [Object],
date: [Object] },
paths:
{ key: [Object],
type: [Object],
coupon_id: [Object],
'date.issued': [Object],
'date.redeemed': [Object],
_id: [Object],
__v: [Object] },
subpaths: {},
virtuals: { id: [Object] },
singleNestedPaths: {},
nested: { date: true },
inherits: {},
callQueue: [ [Array], [Array], [Array], [Array] ],
_indexes: [],
methods: {},
statics: {},
tree:
{ key: [Object],
type: [Object],
coupon_id: [Object],
date: [Object],
_id: [Object],
id: [Object],
__v: [Function: Number] },
query: {},
childSchemas: [],
_plugins: { saveSubdocs: true, validateBeforeSave: true },
s: { hooks: [Object], kareemHooks: [Object] },
options:
{ collection: 'coupons_keys',
retainKeyOrder: false,
typeKey: 'type',
id: true,
noVirtualId: false,
_id: true,
noId: false,
validateBeforeSave: true,
read: null,
shardKey: null,
autoIndex: null,
minimize: true,
discriminatorKey: '__t',
versionKey: '__v',
capped: false,
bufferCommands: true,
strict: true,
pluralization: true },
'$globalPluginsApplied': true },
op: 'find',
options: { retainKeyOrder: false },
_conditions:
{ key: 'qJ5qb...' },
_fields: undefined,
_update: undefined,
_path: undefined,
_distinct: undefined,
_collection:
NodeCollection {
collection:
NativeCollection {
collection: [Object],
opts: [Object],
name: 'coupons_keys',
collectionName: 'coupons_keys',
conn: [Object],
queue: [],
buffer: false,
emitter: [Object] },
collectionName: 'coupons_keys' },
_traceFunction: undefined,
_castError: null,
_count: [Function],
_execUpdate: [Function],
_find: [Function],
_findOne: [Function],
_findOneAndRemove: [Function],
_findOneAndUpdate: [Function],
_replaceOne: [Function],
_updateMany: [Function],
_updateOne: [Function] }
答案 0 :(得分:1)
从您的代码中
module.exports.findKey = function( key, callback ) {
console.log('--- module.exports.findKey --- ' + key );
const query = { key: key };
CouponKey.find(query, callback);
}
函数find
的结果始终是一个数组。因此,如果它没有任何结果,它将返回一个空数组[]。你的回调只检查它是否undefined
,我认为你应该在检查之前记录键值,知道你得到了什么并检查错误。
CouponKey.findKey( req.params._key, (err, key) => {
console.log(err);
console.log(key);
if ( key !== undefined ) { // sadly this was working last night -
console.log( 'yea ---' + key );
} else { // now this is all i get
console.log('ha ha --- ' + req.params._key );
}
});
对于猫鼬而言,如果你只需要1条记录就可以使用函数findOne
代替find
,它会返回一个对象
关于代码打击
const query = { key: key };
x = UserKey.find(query);
console.log(x);
函数find
返回一个mongoose Query而不是记录中的对象。如果您需要记录,则必须传递回调或使用承诺。