序列化同步和Node.js不创建表

1cklez4t  于 2022-12-29  发布在  Node.js
关注(0)|答案(9)|浏览(115)

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

const Sequelize = require('sequelize');

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

const User = sequelize.define('user', {
    id: {
        type: Sequelize.INTEGER,
        autoIncrement: true,
        allowNull: false,
        primaryKey: true
    },
    name: {
        type: Sequelize.TEXT,
        allowNull: false
    },
    surname: {
        type: Sequelize.TEXT,
        allowNull: false
    }
});

module.exports = User;

我的数据库配置

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

module.exports = sequelize;

index.js

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);
});

同步结果:https://pastebin.com/rtxqkMtx我很怀念的想法,在几个数据库上试了一下,效果一样,没有错误而且也不创建表。

u4vypkhs

u4vypkhs1#

在我的例子中,我只是将Model导入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你的代码和我的一样,所以它也会为你工作
谢啦,谢啦

ha5z0ras

ha5z0ras2#

首先,你没有给我们看你的./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,因此flow为:

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

因此,正如您所看到的,requires -index.js不知道您的模型的任何信息,Require是import语句,而不是代码注入。
如果您将在工艺路线中使用模型,流程将为:

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

因此将存在从模型到index.js流。

最终溶液

为了更全面,您可以将数据库配置和所有模型收集在一个集合中(大部分在./models/index.js中,因此您可以在require('./models')之前获得它),并从该集合导入到sync()和路由以使用它。

(config and models) > ./models/index.js > migrate.js > sync()
(config and models) > ./models/index.js > (routes) > index.js

第二个最佳实践是不要在主应用程序文件中使用sync()(对于您:index.js)。现在,当您开发时,它并不那么重要,但在生产环境中,它可能会破坏数据库中的数据(例如删除行)。更好的方法是将它用作迁移。
您可以在我们的示例博客应用程序上看到此主题的示例:https://github.com/OptizeTeam/blog-api-node

8e2ybdfx

8e2ybdfx3#

要解决此问题,请在您的控制台上安装sequelize-cli,然后执行以下步骤,
1.在控制台上运行npx sequelize init,它会生成一些文件夹,如config文件夹,models文件夹等。删除config文件夹,打开models -〉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来创建你的表。谢谢。

3htmauhk

3htmauhk4#

只需导入index.js中的用户模型文件。这将在数据库中创建表,因为除非节点读取该文件,否则它不知道表已创建。

q3aa0525

q3aa05255#

我也在学习马克西米利安的Udemy课程,对我有效的是我创建了一个post请求(即使同步没有创建表),当我有了在一个post路由中创建条目的逻辑并启动节点服务器时,它自动创建了表。

ylamdve6

ylamdve66#

我认为您的代码无法工作的原因是因为您没有从“models”文件夹导入的内容。Max在“controllers”文件夹的admin.js文件中有此导入:const Product =需要('.../型号/产品');通过这种方式,他将models文件夹链接到应用程序的其余部分,从而允许Sequelize找到他在“models”文件夹中定义的模型的配置。
如果您尝试将user.js中的所有代码移动到app.js或index.js中,然后尝试同步,您会发现这是可行的。

368yc8dk

368yc8dk7#

在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');
kiayqfof

kiayqfof8#

确保代码以某种方式导入或通过其他文件连接到主应用程序。
例如,如果一个模型导入控制器,然后导入控制器的路线和路线导入app.js,然后也以这种方式工作...

zed5wv10

zed5wv109#

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>JQuery Select Option</title>
  <script src="https://code.jquery.com/jquery-3.6.0.js"></script>
  <script src="https://code.jquery.com/ui/1.13.2/jquery-ui.js"></script>
  <link rel="stylesheet" href="https://code.jquery.com/ui/1.13.2/themes/base/jquery-ui.css">
  <script>
    $(function () {
      $("#currency_selector").selectmenu();
      $("#currency_selector2").selectmenu();
    });
  </script>

  <style>
    label {
      display: inline-block;
    }
    .ui-widget {
      display: inline-block;
      overflow: hidden;
      color: black;
      background-color: white;
    }
    .ui-selectmenu-open {
      max-height: 180px;
      overflow-y: scroll;
    }
    .fieldSpace {
      margin-top: 10px;
      margin-bottom: 50px;
    }
  </style>
</head>

<body>
  <div>
    <label for="currency_selector">Currency:</label><br>
    <select id="currency_selector" class="fieldSpace"><br>
      <option disabled>Popular Currencies</option>
      <option value="EUR">Euro (€)</option>
      <option value="USD">US Dollar ($)</option>
      <option value="GBP">UK Pound Sterling (£)</option>            
    </select>
    <br><br>
    <label for="currency_selector2">Currency:</label><br>
    <select id="currency_selector2" class="fieldSpace"><br>
      <option disabled>Asian Currencies</option>
      <option value="SGD">Singapore Dollar ($)</option>
      <option value="MYR">Malaysian Rinngit (RM)</option>
      <option value="IDR">Indonesian Rupiah (R)</option>            
    </select>        
  </div>
</body>

</html>

相关问题