Javascript 前置中间件中未定义Mongoose模型

Javascript 前置中间件中未定义Mongoose模型,javascript,node.js,mongodb,mongoose,typeerror,Javascript,Node.js,Mongodb,Mongoose,Typeerror,我正试图构建一个像bitly一样充当URL缩短器的应用程序。然而,我遇到了一个困难,非常感谢你的帮助。我正在用mocha测试我的链接模型,在我的一个预中间件功能中遇到了错误。在这个函数中,我试图获得所有条目的计数,这些条目的url缩短后与我刚才生成的url相匹配,这样我就不会重复缩短后的链接。为了做到这一点,我试图在我的模型上调用Mongoose的count函数,但是我得到了TypeError:“无法读取未定义的属性‘count’”。我曾试图寻找这一切发生的原因,但一直无法找到任何答案 如果你能

我正试图构建一个像bitly一样充当URL缩短器的应用程序。然而,我遇到了一个困难,非常感谢你的帮助。我正在用mocha测试我的链接模型,在我的一个预中间件功能中遇到了错误。在这个函数中,我试图获得所有条目的计数,这些条目的url缩短后与我刚才生成的url相匹配,这样我就不会重复缩短后的链接。为了做到这一点,我试图在我的模型上调用Mongoose的count函数,但是我得到了TypeError:“无法读取未定义的属性‘count’”。我曾试图寻找这一切发生的原因,但一直无法找到任何答案

如果你能帮我弄清楚为什么会发生这种情况,或者有什么更好的方法可以生成缩短的链接,我将非常感激。谢谢

您可以在下面找到我的链接模型代码:

'use strict';

let mongoose = require('mongoose'),
    config = require('../../config/config'),
    schema = mongoose.Schema;

let LinkSchema = new schema({
    originalLink: {
        type: String,
        trim: true,
        validate: [
            function(link) {
                let urlReg = new RegExp("(http|ftp|https)://[\w-]+" +
                    "(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?");
                return urlReg.test(link);
            }, 'The URL entered is not valid'
        ],
        required: 'URL to shorten is required'
    },
    shortenedLink: String
});

LinkSchema.pre('save', function(next) {
    let shortLink;
    let count;
    while (true) {
        console.log(`slink: ${shortLink}, count: ${count}`);
        shortLink = this.generateShortenedLink(this.originalLink);
        mongoose.model['Link'].count({shortenedLink : shortLink}, (err, n) => {
            if (err) {
                console.log(err);
                next();
            }
            count = n;
        });
        if (count === 0) {
            break;
        }
    }

    this.shortenedLink = shortLink;

    next();
});

LinkSchema.methods.generateShortenedLink = function(link) {
    let text = "";
    let possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    for (let i = 0; i < 8; i++ )
        text += possible.charAt(Math.floor(Math.random() * possible.length));

    return config.appUrl + text;
};

mongoose.model('Link', LinkSchema);
“严格使用”;
设mongoose=require('mongoose'),
config=require('../../config/config'),
schema=mongoose.schema;
让LinkSchema=新模式({
原始链接:{
类型:字符串,
特里姆:没错,
验证:[
功能(链接){
设urreg=newregexp(“(http | ftp | https)://[\w-]+”+
“(\.[\w-]+)+([\w,@?^=%&;:/~++-]*[\w@?^=%&;/~++-])”;
返回urreg.test(链接);
},'输入的URL无效'
],
必需:“需要缩短的URL”
},
短链接:字符串
});
LinkSchema.pre('save',函数(下一个){
让短链接;
让我们数一数;
while(true){
log(`slink:${shortLink},count:${count}`);
shortLink=this.generateShortedLink(this.originalLink);
mongoose.model['Link'].count({shortenedLink:shortLink},(err,n)=>{
如果(错误){
控制台日志(err);
next();
}
计数=n;
});
如果(计数==0){
打破
}
}
this.shortenedLink=shortLink;
next();
});
LinkSchema.methods.GenerateSharedLink=函数(链接){
让文本=”;
允许=“ABCDEFGHIJKLMNOPQRSTUVXYZABCDFGHIJKLMNOPQRSTUVXYZ0123456789”;
for(设i=0;i<8;i++)
text+=可能的.charAt(Math.floor(Math.random()*可能的.length));
返回config.appUrl+文本;
};
mongoose.model('Link',LinkSchema);

猫鼬。model
是一个函数,您使用它就像使用对象一样

请尝试以下方法:

mongoose.model('Link').count(...);

哇,真不敢相信我错过了这么简单的东西,谢谢!现在的问题似乎是代码甚至不会执行count函数。它没有破裂,只是似乎永远不会进入计数回调。当我打印出mongoose.model('Link').count是什么时,它告诉我[Function:count],所以看起来它应该工作了。有什么想法吗?在对
.count()
的调用完成之前,您的中间件正在调用
next()
(在最后一行)。它还存在其他异步问题(如
while(true)
循环,它不与异步函数混合)。我不认为是下一个()调用导致了这个问题,因为我在计数回调的最开始放了一个log语句,而代码没有到达那里。然而,你说我没有按照异步风格做事是很有道理的,所以很明显我需要重新思考如何做到这一点。我最初只想将shortenedLink字段标记为唯一,但如果当前生成的字符集不是唯一的,我就不知道如何重新生成随机字符集。谢谢你的帮助!没关系,我误解了你所说的我在错误的时间打电话给next(),你是完全正确的。非常感谢您的帮助,我显然需要学习如何更异步地思考。