预中间件中未定义的Mongoose模型

时间:2016-01-22 07:39:12

标签: javascript node.js mongodb mongoose typeerror

我正在尝试构建一个像bitly一样充当URL缩短器的应用程序。不过,我遇到了麻烦,非常感谢你的帮助。我正在使用mocha测试我的Link模型,并且在我的一个预中间件函数中遇到了错误。在这个函数中,我尝试计算所有具有缩短的url的条目的计数,该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);

1 个答案:

答案 0 :(得分:0)

mongoose.model是一个函数,你正在使用它,好像它是一个对象。

请改为尝试:

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