Nodejs 为什么mongoose model找不到方法

Nodejs 为什么mongoose model找不到方法

我调用App.checkAppkey出下面得错误 [TypeError: Object function model(doc, fields, skipId) { if (!(this instanceof model)) return new model(doc, fields, skipId); Model.call(this, doc, fields, skipId); } has no method ‘checkAppKey’]

//app.coffee mongoose = require 'mongoose’ User = require ‘./user’

schema = new mongoose.Schema( private_token: String, user_ids: Array, user_id: { type: mongoose.Schema.Types.ObjectId, ref: ‘User’ }, created_at: {type: Date, default: Date.now}, updated_at: {type: Date, default: Date.now}, name: String, uuid: String, welcome: String )

module.exports = mongoose.model ‘App’, schema App = module.exports

module.exports.checkAppkey = (appkey, callback) -> App.findOne({private_token: appkey}).exec(callback)

//编译出来得app.js // Generated by CoffeeScript 1.6.3 var App, User, mongoose, schema;

mongoose = require(‘mongoose’);

User = require(’./user’);

schema = new mongoose.Schema({ private_token: String, user_ids: Array, user_id: { type: mongoose.Schema.Types.ObjectId, ref: ‘User’ }, created_at: { type: Date, “default”: Date.now }, updated_at: { type: Date, “default”: Date.now }, name: String, uuid: String, welcome: String });

module.exports = mongoose.model(‘App’, schema);

App = module.exports; User = require(’./user’);

module.exports.checkAppkey = function(appkey, callback) { App.findOne({ private_token: appkey }).exec(callback); };


2 回复

Nodejs 为什么 Mongoose Model 找不到方法

在你的代码中,你试图在一个 Mongoose 模型上调用一个自定义的方法 checkAppkey,但遇到了 TypeError。这是因为你在模块导出时没有正确地将自定义方法添加到模型实例上。

问题分析

在你的代码中,你创建了一个名为 App 的 Mongoose 模型,并且尝试在其原型上添加一个 checkAppkey 方法。但是,Mongoose 模型实例并不直接拥有这些方法,你需要通过其他方式来调用这些方法。

解决方案

你可以通过在模型上添加静态方法或实例方法来解决这个问题。以下是两种不同的方法:

静态方法

静态方法可以直接在模型上使用,而不需要实例化模型。

// app.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const schema = new Schema({
    private_token: String,
    user_ids: Array,
    user_id: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
    created_at: { type: Date, default: Date.now },
    updated_at: { type: Date, default: Date.now },
    name: String,
    uuid: String,
    welcome: String
});

schema.statics.checkAppkey = function (appkey, callback) {
    return this.findOne({ private_token: appkey }).exec(callback);
};

const App = mongoose.model('App', schema);

module.exports = App;

然后在你的控制器或其他文件中,你可以这样调用这个静态方法:

const App = require('./app');

App.checkAppkey('your-appkey', (err, app) => {
    if (err) {
        console.error(err);
    } else {
        console.log(app);
    }
});
实例方法

如果你需要在模型实例上调用方法,可以使用实例方法。但通常情况下,静态方法更常用。

// app.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const schema = new Schema({
    private_token: String,
    user_ids: Array,
    user_id: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
    created_at: { type: Date, default: Date.now },
    updated_at: { type: Date, default: Date.now },
    name: String,
    uuid: String,
    welcome: String
});

schema.methods.checkAppkey = function (callback) {
    return App.findOne({ private_token: this.private_token }).exec(callback);
};

const App = mongoose.model('App', schema);

module.exports = App;

然后在你的控制器或其他文件中,你可以这样调用这个实例方法:

const App = require('./app');
const app = new App({ private_token: 'your-appkey' });

app.checkAppkey((err, result) => {
    if (err) {
        console.error(err);
    } else {
        console.log(result);
    }
});

总结

通过上述方法,你可以确保在 Mongoose 模型上正确地添加和调用自定义方法。静态方法通常是更推荐的选择,因为它们可以在不实例化模型的情况下使用。


根据你提供的信息,问题可能是由于模块导出的方式导致的。在你的 app.coffee 文件中,你定义了一个 checkAppkey 方法并将其挂载到 module.exports 上,但是你在调用 App.checkAppkey 时可能并没有正确地引用这个方法。

示例代码

假设你在一个独立的文件(例如 index.js)中调用 checkAppkey 方法,你需要确保正确地导入了这个方法。以下是一个正确的导入方式:

app.coffee

mongoose = require 'mongoose'
User = require './user'

schema = new mongoose.Schema(
  private_token: String,
  user_ids: Array,
  user_id: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
  created_at: { type: Date, default: Date.now },
  updated_at: { type: Date, default: Date.now },
  name: String,
  uuid: String,
  welcome: String
)

App = mongoose.model 'App', schema
module.exports = App

module.exports.checkAppkey = (appkey, callback) ->
  App.findOne(private_token: appkey).exec callback

index.js

const mongoose = require('mongoose');
const App = require('./app'); // 确保路径正确

mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true, useUnifiedTopology: true });

const appkey = 'your-appkey';
App.checkAppkey(appkey, (err, result) => {
  if (err) throw err;
  console.log(result);
});

解释

  1. 确保正确导出模型和方法:在 app.coffee 文件中,你需要将 App 模型和 checkAppkey 方法都导出。
  2. 正确导入模块:在 index.js 文件中,你需要正确导入 App 模型和 checkAppkey 方法。
  3. 调用方法:确保在调用 checkAppkey 方法时使用正确的语法。

通过以上步骤,你应该能够解决 mongoose model 找不到方法的问题。

回到顶部