Node.js | TypeError: [...] 不是函数

Posted

技术标签:

【中文标题】Node.js | TypeError: [...] 不是函数【英文标题】:Node.js | TypeError: [...] is not a function 【发布时间】:2018-03-19 02:20:10 【问题描述】:

在我的主文件 server.js 中,我有以下功能:

server.js

const mongoose = require('mongoose');
const SmallRounds = require('./models/smallrounds.js');

function initRound()
    logger.info('Initializing round...');
    SmallRounds.getLatestRound((err, data) => 
        [...]
    );

函数 getLatestRound() 被导出到我的猫鼬模型 smallrounds.js 中

smallrounds.js

const mongoose = require('mongoose');
const config = require('../config.js');

const SmallRoundsSchema = mongoose.Schema(
    [...]
);

const SmallRounds = module.exports = mongoose.model('SmallRounds', SmallRoundsSchema);

module.exports.getLatestRound = function(callback)
    SmallRounds.findOne().sort( created_at: -1 ).exec((err, data) => 
        if(err) 
            callback(new Error('Error querying SmallRounds'));
            return;
        
        callback(null, data)
    );

但是当我调用 initRound() 时出现以下错误:

TypeError: SmallRounds.getLatestRound 不是函数

在 initRound (E:\Projects\CSGOOrb\server.js:393:14) 在 Server.server.listen (E:\Projects\CSGOOrb\server.js:372:2) 在 Object.onceWrapper (events.js:314:30) 在 emitNone (events.js:110:20) 在 Server.emit (events.js:207:7) 在 emitListeningNT (net.js:1346:10) 在 _combinedTickCallback (internal/process/next_tick.js:135:11) 在 process._tickCallback (internal/process/next_tick.js:180:9) 在 Function.Module.runMain (module.js:607:11) 启动时 (bootstrap_node.js:158:16) 在 bootstrap_node.js:575:3

为什么会这样?我不认为我有循环依赖,也没有拼错任何东西。谢谢:)

【问题讨论】:

可能mongoose.model 中返回的对象被冻结了还是什么?确保您需要的文件与本文中的完全一致。 是的,我复制粘贴了代码 【参考方案1】:

我使用大写模块,并收到错误TypeError: upperCase is not a function l

et upperCase =require("upper-case") ;
res.end(upperCase("Hello World"));

每个教程都是这样写的。

我改成

res.end(upperCase.upperCase("Hello World"));

工作正常

【讨论】:

【参考方案2】:

这不是您向 Mongoose 模型/模式添加方法的方式。

试试这个:

const mongoose = require('mongoose');
const config = require('../config.js');

const SmallRoundsSchema = mongoose.Schema(
    [...]
);

SmallRoundsSchema.statics.getLatestRound = function(callback)
    this.findOne().sort( created_at: -1 ).exec((err, data) => 
        if(err) 
            callback(new Error('Error querying SmallRounds'));
            return;
        
        callback(null, data)
    );


const SmallRounds = module.exports = mongoose.model('SmallRounds', SmallRoundsSchema);

您可以在此处阅读文档:http://mongoosejs.com/docs/guide.html,位于“静态”部分。还有其他更好的方法可以达到相同的结果,但这会让你开始。

【讨论】:

非常感谢。我真的不知道我的代码发生了什么,几个月来我一直在为这些函数使用 module.exports 并且从来没有遇到过问题,除了今天它突然停止工作。

以上是关于Node.js | TypeError: [...] 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

node.js/discord.js:TypeError:无法读取 null 的属性“setPresence”

Node.js Discord.js UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“calculatedPosition”

TypeError:x 不是 Node.js 中的函数

Node.js UnhandledPromiseRejection:TypeError:无法读取未定义的属性“符号”

Node.js:在没有返回记录的 SQL 查询中:TypeError:无法读取未定义的属性

为啥不和谐的客户端有错误输出:TypeError:node.js中的[CLIENT_MISSING_INTENTS]?