同步同步和Node.js无法创建表

时间:2019-04-03 20:33:43

标签: node.js

我正在学习node.js和sequelizer,遇到一个问题,即我使用Sequelizer创建了一个User模型,不幸的是,我想在index.js中运行sequelizer.sync();它在控制台中显示了结果,但未创建表。

我的模特:

const Sequelize = require('sequelize');
const sequelize = new Sequelize('node-nauka', 'root', '', {
    dialect: 'mysql',
    host: 'localhost'
});

module.exports = sequelize;

我的数据库配置

const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const defaultRoutes = require('./routes/default');
const sequelize = require('./util/database');

app.use(bodyParser.json());

app.use(defaultRoutes);
sequelize.sync().then(result => {
    console.log(result);
    app.listen(3000);
}).catch(err => {
    console.log(err);
});

index.js

TrainingSession(**date**, **time**, ***buildingName***, ***roomNum***, *studentId*, *empId*)

同步结果:https://pastebin.com/rtxqkMtx 我错过了想法,尝试了几种数据库,并且效果相同,没有错误,但是也没有创建表。

7 个答案:

答案 0 :(得分:1)

首先,您没有向我们显示您的./routes/default。您在那使用模型吗? 如果不是,这是错误。在pastebin的输出中,您可以看到:

  models: {},
  modelManager: ModelManager { models: [], sequelize: [Circular] },

在路线中使用模型,您将看到:

  models: { user: user },
  modelManager: ModelManager { models: [ user ], sequelize: [Circular] },

第二,您代码中的require有点意大利面。 在index.js中,您需要./util/database;在./models/user中,您需要./util/database,因此流程为:

index.js < ./util/database > ./models/user

如您所见,在需求的一个方向上没有流动-index.js对您的模型一无所知。要求是import语句,而不是代码注入。

如果您要在路线中使用模型,流量将为:

index.js < ./util/database > ./models/user > ./models/default > index.js

所以会有从模型到index.js的流量。

最终解决方案

为了更全面,您可以将数据库配置和所有模型收集到一个集合中(通常在./models/index.js中,以便可以通过require('./models')进行获取),然后从该集合中导入{{1 }}并利用它来路由。流量:

sync()

第二个最佳实践是不要在主应用程序文件中使用sync()(对您来说:(config and models) > ./models/index.js > migrate.js > sync() (config and models) > ./models/index.js > (routes) > index.js )。现在,当您进行开发时,它并​​不是那么重要,但是在生产中,这可能会破坏数据库中的数据(例如,删除行)。更好的方法是将其用作迁移。

您可以在我们的示例博客应用程序https://github.com/OptizeTeam/blog-api-node

中看到有关这些主题的示例

答案 1 :(得分:1)

就我而言,我只是将模型导入 app.js

const sequelize = require("./src/Utils/database");
const User = require("./src/models/User");

sequelize
  .sync()
  .then((result) => {
    console.log(result);
  })
  .catch((err) => {
    console.log(err);
  });

@PawelC 你的代码和我的一样,所以它也适用于你

谢谢

答案 2 :(得分:0)

要解决此难题,请在控制台上安装sequelize-cli。然后按照以下步骤操作,

  1. 在控制台上运行npx sequelize init,它会生成一些文件夹,例如config文件夹,models文件夹等。删除config文件夹并打开模型-> index.js并以这种方式重构代码:

`

"use strict";
 const Sequelize = require("sequelize");
  const sequelize = new Sequelize("DATABASE NAME ", "USERNAME", "PASSWORD", {
  dialect: "mysql"
});

const models = {
  Product: sequelize.import("./Product") // kindly import the model created in the same folder in this manner and import more models name been created
};

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

models.sequelize = sequelize;
models.Sequelize = Sequelize;
module.exports = models;
`

2。在创建模型的同一模型文件夹中,请以这种方式重构模型创建代码

const sequelize = require("../util/database") // import the Database connection path;

module.exports = (sequelize, DataTypes) => {
  const Product = sequelize.define("product", {
    id: {
      type: DataTypes.INTEGER,
      autoIncrement: true,
      primaryKey: true,
      allowNull: false
    },
    name: {
      type: DataTypes.STRING,
      unique: true
    },
    email: {
      type: DataTypes.STRING,
      unique: true
    },
    password: DataTypes.STRING
  });

  return Product;
};
  1. 在index.js文件中

`

    const express = require('express');
    const bodyParser = require('body-parser');
    const app = express();
    const defaultRoutes = require('./routes/default');
    const sequelize = require('./util/database');
    const models = require("./models");  // add your models folder created (Index.js)

    app.use(bodyParser.json());

    app.use(defaultRoutes);

    // Add models.sequelize script

    models.sequelize.sync({ force: true }).then(result => {
        console.log(result);
        app.listen(3000);
    }).catch(err => {
        console.log(err);
    });

`

  1. 然后运行代码-> npm start来创建表。谢谢。

答案 3 :(得分:0)

我还遵循了Maximilian的Udemy课程,对我有用的是我创建了一个发布请求(即使同步未创建表),并且当我具有在其中一个发布路线中创建条目的逻辑时我启动了节点服务器,它自动创建了表。

答案 4 :(得分:0)

只需将用户模型文件导入index.js中即可。这将在数据库中创建表,除非节点直到读取该文件才知道该表已创建。

答案 5 :(得分:0)

我认为您的代码无法正常工作的原因是因为您没有从“模型”文件夹中导入某些内容。 Max在“ controllers”文件夹中的admin.js文件中有此导入:const Product = require('../ models / product');这样他就将models文件夹链接到了应用程序的其余部分,从而使Sequelize可以找到他在“ models”文件夹中定义的模型的配置。

如果您尝试将所有代码从user.js移至app.js或index.js并尝试进行同步,那么您会发现这可行。

答案 6 :(得分:0)

在index.js中

导入模型。

例如:-

const Product = require('./models/product');
const User = require('./models/user');

之后:-

const sequelize = require('./util/database');

代码如下所示:-

const sequelize = require('./util/database');
const Product = require('./models/product');
const User = require('./models/user');