【问题标题】:Node.js MySQL model designingNode.js MySQL 模型设计
【发布时间】:2016-12-23 03:09:26
【问题描述】:

我正在使用 MySQL 数据库开发一个 node.js 应用程序,但我一直坚持在我的应用程序的 node.js 端制作模型。我以前使用猫鼬来生成模式并使用模型来执行数据库功能,但我找不到对 MySQL 的这种支持。任何人都可以建议一种在node.js中隔离我的数据库功能的正确方法,就像我可以用猫鼬做的那样。这是我现在正在使用的 app.js 和用户模型。

应用文件:

var express= require("express");
var bodyParser = require("body-parser");
var mysql = require("mysql");
var UserModel= require("./models/User.js")
var app=express();

var sql = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "1234",
    database: "dricm"
});

sql.connect(function (err) {
    if(err){
        console.log("error");
    }else{
        console.log("connected");
    }
});

app.set("views", "./views");

app.use(express.static("node_modules/bootstrap/dist"));
app.use(express.static("public"));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false}));

app.get('/', function (req, res) {
    res.render("signup.jade");
});

app.post('/signup', function (req, res) {
    var obj= {
        username: req.body.username,
        password: req.body.password
    };
    UserModel.createUser(obj);
    res.redirect("/");
});

app.listen(3000, function () {
    console.log("server running at 3000");
});

用户(可能的模型)

var mysql= require("mysql");
var bcrypt = require("bcryptjs");

var sql = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "1234",
    database: "dricm"
});

sql.connect(function (err) {
    if(err){
        console.log("error");
    }else{
        console.log("connected");
    }
});

var User= {

}

User.createUser = function createUser(newUser) {
    bcrypt.genSalt(10, function(err, salt){
        bcrypt.hash(newUser.password,salt, function (err, hash) {
            newUser.password = hash;
            var query = sql.query("INSERT INTO USERS set ?", newUser, function (err, res) {
                console.log(query);
                if(err) {
                    console.log("error");
                }
                else{

                    console.log(res.insertId);
                }
            });
        });
    });

}

module.exports= User;

【问题讨论】:

  • Sequelize 有一个非常好的模型框架,如果你需要它,或者一个很好的数据库层,如果你不需要它。不确定set ? 在这里应该是什么意思,通常是SET x=?,y=?, ... 或更常见的是(name, ...) VALUES (?, ...)
  • @tadman set ? 如果参数是字典,则替换以逗号分隔的 key=value 对列表,另请参见 the documentation,此处用作示例。
  • @Tanmoy node-mysql 似乎在 mysql 之上添加了一些建模功能(我实际上是在自己研究这个时发现了这篇文章),虽然我还没有完全理解它。
  • @JasonC 感谢您的澄清。以前从未见过这样做。

标签: mysql node.js model


【解决方案1】:

您正在寻找的称为 ORM(对象关系映射)Mongoose 是 MongoDB 的一种(这是一个面向 NOSQL 文档的数据库)

还有其他适用于 Node.js 的关系型数据库 ORM,目前最流行的是Sequelize,我亲自使用并推荐过。

使用 Sequelize,您可以像 Mongoose 一样将模型放在不同的文件中,但是为了加载它们,您需要在 index.js 中使用简单的脚本添加它们

想象以下工作区:

--models/
----User.js
----Permissions.js
--index.js

你的模型定义是这样的:

用户.js

const UserModel = (sequelize, Sequelize) => {
    const {INTEGER, STRING, FLOAT, BOOLEAN, DATE} = Sequelize
    const User = sequelize.define('User', {
        UserId: {type: INTEGER, primaryKey: true, autoIncrement: true},
        Username: {type: STRING, primaryKey: true, allowNull: false},
        Password: STRING
    })
    return User
}

module.exports = UserModel

Permissions.js

const PermissionsModel = (sequelize, Sequelize) => {
    const {INTEGER, STRING, FLOAT, BOOLEAN, DATE} = Sequelize
    const Permissions = sequelize.define('Permissions', {
        Role: {type: STRING, allowNull: false},
        ControllerAddress: {type: STRING, allowNull: false}
    })
    return Permissions
}

module.exports = PermissionsModel

现在您需要使用以下脚本在 index.js 中使用它们

let normalizedPath = require('path').join(__dirname, "models")
    require('fs').readdirSync(normalizedPath).forEach((file) => {
        sequelize.import('./models/' + file)
    })
    let {User, Permissions} = sequelize.models

现在您可以使用 User 和 Permissions 实例来控制它们并调用类似的函数

User.create({Username, Password})

【讨论】:

    猜你喜欢
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多