使用 Node.js 和 Express 的 Sequelize ORM 的 Rest API 示例
本文假设您对项目和连接 sequelize 数据库的基本设置有一定的了解。
让我们制作一个 sequelize-app Node 应用程序并安装 Sequelize。首先,为我们的项目创建一个目录,进入它,然后使用默认设置创建一个项目:
$ mkdir sequelize-app
$ cd sequelize-app
进入全屏模式 退出全屏模式
通过运行以下命令来初始化 NodeJS 应用程序:
$ npm init -y
进入全屏模式 退出全屏模式
这将创建一个带有基本配置的 package.json 文件。您可以通过省略 -y 标志来手动添加配置。
接下来,我们将使用基本的 Express 服务器创建应用程序文件。我们将其命名为 app.js 并在项目文件夹中运行以下命令行。
$ npm i express
进入全屏模式 退出全屏模式
在新创建的 app.js 文件中添加以下代码
const express = require('express');
const morgan = require('morgan');
const bodyParser = require('body-parser');
// router import
const user = require('./routes/user')
const app = express();
app.use(express.json())
app.use(morgan('tiny'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
// Routing
app.use('/api', user)
// simple route
app.get("/", (req, res) => {
res.json({ message: "Welcome to application." });
});
// set port, listen for requests
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}.`);
});
进入全屏模式 退出全屏模式
Morgan 是 Node.js 的 HTTP 请求记录器中间件。 js。它简化了将请求记录到您的应用程序的过程
$ npm i morgan
进入全屏模式 退出全屏模式
为了访问发布数据,我们必须使用 body-parser 。基本上,body-parser 是什么,它允许 express 读取 body,然后将其解析为我们可以理解的 Json 对象
$ npm install body-parser
进入全屏模式 退出全屏模式
当我们进行更改时,我们必须终止进程并重新启动才能看到效果。所以,我们将安装一个包来减轻我们的压力:Nodemon
$ npm i nodemon
进入全屏模式 退出全屏模式
编辑 package.json 文件中的脚本,如下所示:
"scripts": {
"start": "nodemon app.js"
},
进入全屏模式 退出全屏模式
Express JS 应用程序中的 Sequelize 设置
在本文中,我将使用 Postgres DB,但您可以使用任何您熟悉的 DB,例如 MySQL、SQLite 等。
$ npm install -g sequelize-cli
$ npm install sequelize-cli
进入全屏模式 退出全屏模式
通过运行以下命令安装 Sequelize 和 Postgres 包:
$ npm i sequelize pg
进入全屏模式 退出全屏模式
接下来,我们在项目中初始化 Sequelize。
$ sequelize init
进入全屏模式 退出全屏模式
该命令为 Sequelize ORM 创建必要的文件夹和文件。
如果你看 sequelize-app/models/index.js,让我们看一下代码片段
'use strict';
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};
let sequelize;
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
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 => {
const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
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;
进入全屏模式 退出全屏模式
创建一个数据库并相应地更新 config/config.json 文件:
我们真正关心开发过程更改用户名密码和数据库,方言名称不要让其他过程头疼
{
"development": {
"username": "dream99",
"password": "dream99",
"database": "sequlizeApp",
"host": "127.0.0.1",
"dialect": "postgres"
},
"test": {
"username": "root",
"password": null,
"database": "database_test",
"host": "127.0.0.1",
"dialect": "postgres"
},
"production": {
"username": "root",
"password": null,
"database": "database_production",
"host": "127.0.0.1",
"dialect": "postgres"
}
}
进入全屏模式 退出全屏模式
现在一切都设置为创建模型和迁移。
让我们为用户创建一个模型和迁移。
运行命令:
npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string
进入全屏模式 退出全屏模式
此命令在相应文件夹中创建用户模型和迁移表。属性是我们希望在表上拥有的字段。
用户模型如下所示:
'use strict';
const {
Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class User extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) {
// define association here
}
};
User.init({
firstName: DataTypes.STRING,
lastName: DataTypes.STRING,
email: DataTypes.STRING
}, {
sequelize,
modelName: 'User',
});
return User;
};
进入全屏模式 退出全屏模式
接下来,我们运行迁移以创建数据库表:
sequelize db:migrate
进入全屏模式 退出全屏模式
像这样的迁移:
'use strict';
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable('Users', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
firstName: {
type: Sequelize.STRING
},
lastName: {
type: Sequelize.STRING
},
email: {
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.dropTable('Users');
}
};
进入全屏模式 退出全屏模式
假设我们要默认向几张表中插入一些数据。种子文件是数据中的一些更改,可用于使用示例数据或测试数据填充数据库表。
让我们创建一个种子文件,它将一个演示用户添加到我们的用户表下面的命令:
$ npx sequelize-cli seed:generate --name demo-user
进入全屏模式 退出全屏模式
种子文件如下所示:
'use strict';
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.bulkInsert('Users', [{
firstName: 'John',
lastName: 'Doe',
email: 'example@example.com',
createdAt: new Date(),
updatedAt: new Date()
}], {});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.bulkDelete('Users', null, {});
}
};
进入全屏模式 退出全屏模式
在最后一步中,您创建了一个种子文件。它仍然没有致力于数据库。为此,我们需要运行一个简单的命令。
$ npx sequelize-cli db:seed:all
进入全屏模式 退出全屏模式
我们的数据库现已创建。现在让我们制作路由和控制器
在 sequelize-app 中创建一个 controllers 文件夹并将 user.js 文件添加到其中。这就是我们的用户管理逻辑所在的位置。
添加以下代码以创建具有逻辑的用户控制器:
const User = require('../models').User
module.exports = {
// create account
signUp: (req, res) => {
let { firstName, lastName, email} = req.body
User.create({
firstName,
lastName,
email
}).then((user) => {
return res.status(201).json({
"message": "User created successfully",
user
}).catch(err => {
return res.status(400).json({err})
})
})
},
updateSignUp: (req, res) => {
let { firstName, lastName, email} = req.body
let id = req.params.id
User.findOne({
where: {id:id}
}).then( user => {
if (user){
user.update({firstName, lastName, email})
.then((updateUser) => {
return res.status(202).json({
"message": "User updated successfully",
updateUser
})
})
}else{
return res.status(206).json({
"message": "User not found"
})
}
}).catch(error => {
return res.status(400).json({
"error": error
})
})
},
// get all users
getAllUsers: ( req, res ) => {
User.findAll( {
attributes: ['id', 'firstName', 'lastName', 'email'],
limit: 5,
order: [['id', 'DESC']]
}).then(users => {
return res.status(200).json({
users
})
}).catch(err => {
return res.status(400).json({err})
})
},
// get single user by id
getSingleUser:(req, res) => {
let id = req.params.id
User.findByPk(id)
.then((user) => {
return res.status(200).json({user})
}).catch(err => {
return res.status(400).json({err})
})
},
// delete user by id
deleteSingleUser: (req, res) => {
let id = req.params.id
User.destroy({
where: {id: id}
}).then(() =>{
return res.status(200).json({
"message": "User Deleted successfully"
})
}).catch(err =>{
return res.status(400).json({error})
})
},
// delete all users
deleteAllUsers: (req, res) => {
User.destroy({
truncate: true
}).then(() => {
return res.status(200).json({
success: true,
"message": "All Users deleted"
})
}).catch(err => {
return res.status(400).json({
err
})
})
},
}
进入全屏模式 退出全屏模式
创建包含 user.js 文件的 routes 文件夹并添加以下代码:
const express = require('express')
const router = express.Router()
const {
signUp,
updateSignUp ,
getAllUsers,
getSingleUser,
deleteSingleUser,
deleteAllUsers,
} = require('../controllers/user')
// -------------------------CUSTOM ROUTE-------------------------
router.post('/sign-up',
signUp
)
router.put('/sign-up/:id',
updateSignUp
)
router.get('/sign-up/',
getAllUsers
)
router.get('/sign-up/:id',
getSingleUser
)
router.delete('/sign-up/:id',
deleteSingleUser
)
router.delete('/sign-up/',
deleteAllUsers
)
// -------------------------EXPORT ROUTER-------------------------
module.exports = router
进入全屏模式 退出全屏模式
让我们看一些静态图片邮递员:
获取所有用户:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--FMRkwkhO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/6o398ezcltosvspxhg6s.png)
获取单个用户:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--6x6TIlus--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/6ww1hiw40pxz4fn0i9gl.png)
实际上这是 Express JS REST API、Postgres 和 Sequelize ORM 的基本设置
如果您有任何信息,请在下面发表评论。快乐编码...
随意查看以下代码:
https://github.com/Julfikar-Haidar/sequelize-app
更多推荐
所有评论(0)