【问题标题】:Cannot read property 'findOne' of undefined in Node and Sequelize无法读取 Node 和 Sequelize 中未定义的属性“findOne”
【发布时间】:2018-10-01 12:56:15
【问题描述】:

这是我的 admin_pages.js 文件,我已完成迁移和模型,但出现此错误。

TypeError:无法读取未定义的属性“findOne” 在 C:\users\gaffer\desktop\gaffercart\routes\admin_pages.js:80:21 在 Layer.handle [as handle_request] (C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\layer.js:95:5) 在下一个(C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\route.js:137:13) 在 Route.dispatch (C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\route.js:112:3) 在 Layer.handle [as handle_request] (C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\layer.js:95:5) 在 C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\index.js:281:22 在 Function.process_params (C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\index.js:335:12) 在下一个(C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\index.js:275:10) 在 Function.handle (C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\index.js:174:3) 在路由器(C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\index.js:47:12) 在 Layer.handle [as handle_request] (C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\layer.js:95:5) 在 trim_prefix (C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\index.js:317:13) 在 C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\index.js:284:7 在 Function.process_params (C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\index.js:335:12) 在下一个(C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\index.js:275:10) 在 C:\users\gaffer\desktop\gaffercart\index.js:70:3 在 Layer.handle [as handle_request] (C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\layer.js:95:5) 在 trim_prefix (C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\index.js:317:13) 在 C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\index.js:284:7 在 Function.process_params (C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\index.js:335:12) 在下一个(C:\users\gaffer\desktop\gaffercart\node_modules\express\lib\router\index.js:275:10) 在 C:\users\gaffer\desktop\gaffercart\node_modules\connect-flash\lib\flash.js:21:5

var express=require('express');
var router=express.Router();
var expressValidator = require('express-validator');
var bodyParser=require('body-parser');
var models=require('../models');

// var mysql=require('mysql');
// var Sequelize=require('sequelize');
// var DataTypes=Sequelize.DataTypes;
// var sequelize = exports.sequelize = module.parent.exports.sequelize;
// let sequelize=new Sequelize();

//Get Page model
const Page = require('../models/page');

/*
* GET PAGES INDEX its correct but commiting it
*/

 router.get('/',function(req,res){
 //  Page.find({}).sort({sorting: 1}).exec(function(err,pages){
    res.render('admin/pages',{ 
      //pages:pages
    });
   });
 //});
//  router.get('/admin/dashboard',function(req,res){
//    res.render('admin/dashboard');
//  });


/*
** GET ADD PAGE
*/
 router.get('/add-page',function(req,res){
   var title="";
   var slug="";
   var content="";


   res.render('admin/add_page',{
      title:title,
      slug:slug,
      content:content

   });

 });

//POST ADD page
 router.post('/add-page',function(req,res){
  //  console.log("alsdjlajsi")

  req.checkBody('title','Title must have a body.').notEmpty();
  req.checkBody('content','Content must have a body.').notEmpty();

  var title = req.body.title;
  var slug = req.body.slug.replace(/\s+/g, '-').toLowerCase();
  if(slug == " ")  
  {
    slug = title.replace(/\s+/g, '-').toLowerCase();
  }
  var content = req.body.content;
  var errors = req.validationErrors();

  //If there are Errors then define it on the same page
  if(errors){
    res.render('admin/add_page',{
      errors:errors,
      title:title,
      slug:slug,
      content:content
    });
  }
  /*
  * Have use Pages
  */
      else{

        models.Page.findOne({slug:slug}, function(err, page){

        if(page){
          req.flash('danger','Page slug Already Exist,');
          res.render('admin/add_page',{

            title:title,
            slug:slug,
            content:content
          });
        }
        else{
            var page = new Page({
              title:title,
              slug:slug,
              content:content,
              sorting:100
            });
            page.save(function(err){
              if(err) return console.log(err);

              req.flash('success','Page Added Successfully!!');
              res.redirect('/admin/pages');
            });
        }
      });

  }

});
//Exports
module.exports=router;

这是我的页面模型

'use strict';
// var Sequelize=require('sequelize');

module.exports = (sequelize, DataTypes) => {
  var page = sequelize.define('page', {
    title: DataTypes.STRING,
    slug: DataTypes.STRING,
    content: DataTypes.STRING,
    sorting:DataTypes.INTEGER
  }, {});
  page.associate = function(models) {
    // associations can be defined here
  };
  return page;
};

【问题讨论】:

    标签: express sequelize.js


    【解决方案1】:

    您已将 Page 模型定义为 'page'(小写):

    var page = sequelize.define('page', {...})
    

    但将其用作:

     models.Page.findOne(...) // uppercase
    

    使用models.page 或将模型定义更改为大写:

    var page = sequelize.define('Page', {...}) // uppercase
    

    也改变这个:

    //Get Page model
    const Page = require('../models/page');
    

    到这里:

    const Page = require('../models').Page // or .page if you keep your definition lowercase
    

    findOne 不接受函数回调,您必须使用where 通过slug 属性进行搜索。使用以下内容:

    else { 
      models.Page.findOne({ 
        where: { slug }  // destructuring
      })
      .then((page) => {
        // work with the page instance
      })
      .catch((err) => {
        // error case
      })
    
    }
    

    page.save()相同:

    page.save()
      .then(() => {
        req.flash('success','Page Added Successfully!!');
        res.redirect('/admin/pages');
      })
      .catch((err) => {
        // handle error
      })
    

    【讨论】:

    • 我现在收到这个错误朋友你就在上面,我花了一周时间才找到这个(续集)警告:模型属性(slug)传递到模型页面的查找器方法选项中,但是选项。对象为空的地方。您是否忘记使用 options.where?执行(默认):SELECT id, title, slug, content, sorting, createdAt, updatedAt FROM Pages AS Page LIMIT 1;你能帮我解决这个问题吗
    • models.Page.findOne({slug: slug}, function (err, page) { if (page) {
    • 使用wherefindOne 不接受函数回调,它返回一个Promise 所以你必须使用thenasync/await。我更新了我的答案。请参阅那里的示例。
    • 你能告诉我怎么做吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 2016-01-10
    • 2021-05-29
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 2016-09-05
    相关资源
    最近更新 更多