我是一名学习编码的学生,所以不要期望代码的质量很好。我正在为我的学校项目制作一个游戏,我在 VS Code 中使用 javascript、node js 和 mysql2。我只使用postman来获取json格式的结果,因为我还没有学会实现前端。
邮递员将用作“post - http://localhost:3000/inventory/userId”,其中 userId 是用户想要放入的内容,它将创建一个玩家,同时还将创建库存,装备和未装备的行。新创建的行应在 invenoty 和player 列中使用。如果你看看我的图片或表格,我想你可能会明白我想说的。 。
我想我可能需要使用中间件功能,但我仍然不太确定。
我还没有真正为我的控制器文件编写任何内容,因为我首先想确保我有代码来创建包含项目的行。以下是我迄今为止编写的代码。
inventoryRoute.js
const express = require('express');
const router = express.Router();
const controller = require('../controllers/inventoryController');
router.post('/:userId', controller.createPlayer); // Create player with inventory
module.exports = router;
inventoryModel.js
module.exports.insertSingle = (data, callback) => {
const SQL_STATEMENT = `
INSERT INTO Inventory (equipped_id, unequipped_id)
INSERT INTO Equipped (inventory_id, weapon_id, armor_id, artifact_id)
INSERT INTO Unequipped (inventory_id, weapon_id, armor_id, artifact_id)
INSERT INTO Player (user_id, inventory_id)
VALUES (?, ?);
SELECT * FROM Player
WHERE id = LAST_INSERT_ID();
`;
const VALUES = [data.user_id, data.inventory_id];
pool.query(SQL_STATEMENT, VALUES, callback);
}
表.js
CREATE TABLE User (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username TEXT,
email TEXT
);
CREATE TABLE Player (
player_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
inventory_id INT NOT NULL,
hp INT DEFAULT 3,
atk INT DEFAULT 1,
def INT DEFAULT 1
);
CREATE TABLE Inventory (
inventory_id INT PRIMARY KEY AUTO_INCREMENT,
equipped_id INT NOT NULL,
unequipped_id INT NOT NULL
);
CREATE TABLE Equipped (
equipped_id INT PRIMARY KEY AUTO_INCREMENT,
inventory_id INT,
weapon_id INT,
armor_id INT,
artifact_id INT
);
CREATE TABLE Unequipped (
unequipped_id INT PRIMARY KEY AUTO_INCREMENT,
inventory_id INT,
weapon_id INT,
armor_id INT,
artifact_id INT
);
CREATE TABLE Weapon (
weapon_id INT PRIMARY KEY AUTO_INCREMENT,
unequipped_id INT,
merchant_id INT NOT NULL,
name TEXT NOT NULL,
description TEXT,
atk INT,
points INT
);
INSERT INTO Weapon (unequipped_id, merchant_id, name, description, atk, points) VALUES
(NULL, 1, 'Dull Sword', 'A sword that has not been sharpened in a while', 3, 1);
CREATE TABLE Armor (
armor_id INT PRIMARY KEY AUTO_INCREMENT,
unequipped_id INT,
merchant_id INT NOT NULL,
name TEXT NOT NULL,
description TEXT,
def INT,
points INT
);
INSERT INTO Armor (unequipped_id, merchant_id, name, description, def, points) VALUES
(NULL, 1, 'Worned Out Armor', 'An armor that has worn out due to long usage and no maintenance', 3, 1);
CREATE TABLE Artifact (
artifact_id INT PRIMARY KEY AUTO_INCREMENT,
unequipped_id INT,
merchant_id INT NOT NULL,
name TEXT NOT NULL,
description TEXT,
hp INT,
points INT
);
INSERT INTO Artifact (unequipped_id, merchant_id, name, description, hp, points) VALUES
(NULL, 1, 'Health Boost Necklace', 'A necklace that increases health slightly', 2, 1);
CREATE TABLE Merchant (
merchant_id INT PRIMARY KEY AUTO_INCREMENT,
name TEXT NOT NULL,
weapon_id INT NOT NULL,
armor_id INT NOT NULL,
artifact_id INT NOT NULL
);
INSERT INTO Merchant (name, weapon_id, armor_id, artifact_id) VALUES
('John', 1, 1, 1);
您提供的代码似乎是尝试使用 Node.js 和 MySQL 数据库执行多个 SQL
INSERT
操作,然后执行 SELECT
语句。但是,SQL 语法不正确。如果不使用 INSERT
,则单个查询中不能有多个 transactions
语句。
这是使用事务的代码的更正版本:
module.exports.insertSingle = (data, callback) => {
const SQL_STATEMENT = `
START TRANSACTION;
INSERT INTO Inventory (equipped_id, unequipped_id) VALUES (?, ?);
SET @inventory_id = LAST_INSERT_ID();
INSERT INTO Equipped (inventory_id, weapon_id, armor_id, artifact_id) VALUES (@inventory_id, ?, ?, ?);
INSERT INTO Unequipped (inventory_id, weapon_id, armor_id, artifact_id) VALUES (@inventory_id, ?, ?, ?);
INSERT INTO Player (user_id, inventory_id) VALUES (?, @inventory_id);
COMMIT;
SELECT * FROM Player WHERE id = LAST_INSERT_ID();
`;
const VALUES = [
data.equipped_id,
data.unequipped_id,
data.weapon_id_equipped,
data.armor_id_equipped,
data.artifact_id_equipped,
data.weapon_id_unequipped,
data.armor_id_unequipped,
data.artifact_id_unequipped,
data.user_id,
];
pool.query(SQL_STATEMENT, VALUES, callback);
}
有几点需要注意:
START TRANSACTION
和 COMMIT
语句,将 INSERT
操作分组到一个事务中。这确保要么执行所有 INSERT
语句,要么都不执行。SET @variable_name = value
语法将最后插入的 ID
存储到变量中(在本例中为 @inventory_id),以便在后续 INSERT
语句中使用它。VALUES
数组中的缺失值添加了占位符。您可能需要根据您的数据结构调整它们。请根据您的具体数据库架构和要求调整代码。