【问题标题】:Mongoose Model Undefined in Pre Middleware预中间件中未定义的 Mongoose 模型
【发布时间】:2016-04-28 17:46:29
【问题描述】:

我正在尝试构建一个像 bitly 一样充当 URL 缩短器的应用程序。但是,我遇到了障碍,非常感谢您的帮助。我正在使用 mocha 测试我的 Link 模型,并且在我的一个预中间件函数中遇到了错误。在此函数中,我尝试计算所有具有与我刚刚生成的 URL 匹配的缩短 url 的条目的数量,这样我就不会在缩短的链接上加倍。为了做到这一点,我试图在我的模型上调用 Mongoose 的计数函数,但我得到了 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);

【问题讨论】:

    标签: javascript node.js mongodb mongoose typeerror


    【解决方案1】:

    mongoose.model 是一个函数,您将它当作一个对象来使用。

    试试这个:

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

    【讨论】:

    • 哇,我不敢相信我错过了这么简单的东西,谢谢!现在的问题似乎是代码甚至不会执行 count 函数。它不会中断,只是似乎永远不会进入计数回调。当我打印出 mongoose.model('Link').count 是什么时,它告诉我 [Function: count],所以它看起来应该可以工作。有什么想法吗?
    • 在对.count() 的调用完成之前,您的中间件正在调用next()(在最后一行)。它还存在其他异步问题(例如不与异步函数混合的while (true) 循环)。
    • 我不认为是 next() 调用导致了问题,因为我在计数回调的最开始放置了一条日志语句并且代码没有到达那里。但是,你说我不按照 async 风格做事是有道理的,所以显然我需要重新考虑如何去做。我最初只想将shortenedLink 字段标记为唯一,但如果我生成的当前字符集不是唯一的,我无法弄清楚如何重新生成随机字符集。感谢您的所有帮助!
    • 没关系,我误解了你所说的我在错误的时间调用 next(),你是完全正确的。非常感谢大家的帮助,我显然需要学习如何更加异步地思考。
    猜你喜欢
    • 2019-03-18
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 2020-03-25
    • 2018-01-18
    • 2012-04-15
    相关资源
    最近更新 更多