【问题标题】:TypeError: count is not a function in node.js and sequelize类型错误:count 不是 node.js 中的函数和 sequelize
【发布时间】:2018-09-29 20:14:53
【问题描述】:

我正在关注 the Node.js + Express tutorial from the Mozilla Developer Network,但我正在使用 MySQL 和 sequelize

我在Model.count() 调用时遇到错误:

TypeError: Book.count 不是函数 在 bookCount (D:\node-apps\express-library\controllers\bookController.js:9:12)

以下是来自controllers/bookController.js的代码。错误是从Book.count().then(callback); 行触发的。

var Book = require('../models/book');
var Author = require('../models/author');

var async = require('async');

exports.index = function(req, res) {
  async.parallel({
    bookCount: function(callback) {
      Book.count().then(callback);
    },
    authorCount: function(callback) {
      Author.count().then(callback);
    }
  }, function(err, results) {
    console.log(results);
    res.render('index', { title: 'Local Library', error: err, data: results });
  });
};

我调试了console.log(Book),它返回[function]。以下为models/book.js

'use strict';

module.exports = (sequelize, DataTypes) => {
  var Book = sequelize.define('Book', {
    title: DataTypes.STRING,
    summary: DataTypes.STRING,
    isbn: DataTypes.STRING,
    url: DataTypes.STRING
  }, {});

  Book.associate = function(models) {
    // associations can be defined here
    Book.belongsTo(models.Author, {
      onDelete: 'CASCADE',
      foreignKey: {
        allowNull: false
      }
    });
    Book.hasMany(models.BookInstance);
    Book.belongsToMany(models.Genre, {
      through: 'BookGenres',
      onDelete: 'CASCADE'
    });
  };

  return Book;
};

【问题讨论】:

  • 我收到过很多反对票 :) 我没有足够的续集经验。抱歉我的问题不好。

标签: node.js express sequelize.js


【解决方案1】:

models/book.js 中导出一个函数,该函数返回 Book 模型,而不是模型本身。

所以当你写...

var Book = require('../models/book');

...你得到一个存储在Book 变量中的函数。要获取模型本身,您应该运行该函数:

var Book = require('../models/book'); // that will be a function
var BookModel = Book(sequelize, dataTypes); // and that will be the model

或者你可以在你的 require 语句中运行这些函数:

var Book = require('../models/book')(sequelize, dataTypes);
var Author = require('../models/author')(sequelize, dataTypes);

【讨论】:

  • 我添加了自己的答案。感谢您的回答。
【解决方案2】:

您错误地导入了续集模型。

            var Book = sequelize.import('../models/Book');
        //note that the 'sequelize' is instance of sequelize and not Constructor.

根据您的情况,您可能还想匹配模型定义中的表名 'Book' 而不是 'book',因为您的模型定义定义了 'Book'

参考 - http://docs.sequelizejs.com/manual/tutorial/models-definition.html#import

【讨论】:

  • 我添加了自己的答案。感谢您的回答。
【解决方案3】:

我有这个模块脚本models/index.js:

'use strict';

var fs        = require('fs');
var path      = require('path');
var Sequelize = require('sequelize');
var basename  = path.basename(__filename);
var env       = process.env.NODE_ENV || 'development';
var config    = require(__dirname + '/../config/config.js')[env];
var db        = {};

if (config.use_env_variable) {
  var sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  var sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    var model = sequelize['import'](path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

所以,我替换了这两个 require 语句

var Book = require('../models/book');
var Author = require('../models/author');

var models = require("../models");

然后,调用models.Book.count()models.Author.count() 解决了问题。

var async = require('async');
var models = require('../models');

exports.index = function(req, res) {
  async.parallel({
    bookCount: function(callback) {
      models.Book.count().then(count => {
        callback(null, count);
      });
    },
    authorCount: function(callback) {
      models.Author.count().then(count => {
        callback(null, count);
      });
    }
  }, function(err, results) {
    res.render('index', { title: 'Local Library', error: err, data: results });
  });
};

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2015-11-05
    • 2019-02-05
    • 2016-01-23
    • 2018-09-09
    • 1970-01-01
    • 2023-02-01
    • 2020-10-06
    • 2016-02-26
    相关资源
    最近更新 更多