मैं Node.js + Express को फ़ॉलो कर रहा हूं Mozilla Developer Network से ट्यूटोरियल, लेकिन मैं Sequelize के साथ MySQL का उपयोग कर रहा हूं।

मुझे 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;
};
0
Sithu 19 अप्रैल 2018, 13:45

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;

इसलिए, मैंने इन दोनों की आवश्यकता वाले बयानों को बदल दिया

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 });
  });
};
0
Sithu 20 अप्रैल 2018, 06:44

models/book.js में आप एक फ़ंक्शन निर्यात करते हैं, जो पुस्तक मॉडल लौटाता है, न कि स्वयं मॉडल।

तो जब आप लिखते हैं...

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

या आप उन कार्यों को अपने आवश्यक बयानों में चला सकते हैं:

var Book = require('../models/book')(sequelize, dataTypes);
var Author = require('../models/author')(sequelize, dataTypes);
1
poohitan 19 अप्रैल 2018, 13:49

आप अनुक्रम मॉडल गलत तरीके से आयात कर रहे हैं।

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

आप मॉडल परिभाषा से तालिका नाम का मिलान करना चाह सकते हैं, आपके मामले में 'पुस्तक' और 'पुस्तक' नहीं, क्योंकि आपकी मॉडल परिभाषा 'पुस्तक' को परिभाषित करती है

संदर्भ - http://docs.sequelizejs.com/manual/tutorial/ model-definition.html#import

1
Kshateesh 19 अप्रैल 2018, 14:27