Javascript MongoDB事务实现
我得到的代码使用express和mongodb(mongoose)在db中存储喜欢的动画,用户可以喜欢/不喜欢动画,因此我需要实现事务:Javascript MongoDB事务实现,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我得到的代码使用express和mongodb(mongoose)在db中存储喜欢的动画,用户可以喜欢/不喜欢动画,因此我需要实现事务: const express = require('express'); const router = express.Router(); const mongoose = require('mongoose'); const User = require('./login').User; mongoose.connect('mongodb://localho
const express = require('express');
const router = express.Router();
const mongoose = require('mongoose');
const User = require('./login').User;
mongoose.connect('mongodb://localhost:27017/animationsdb');
router.get('/', async(req, res) => {
// implement transaction
try {
const result = await User.findOne({ username: req.query.username });
if (result) {
console.log("Liked animations:", result.likedAnimations);
res.send({ animationList: result.likedAnimations });
} else {
console.log("no database result found");
res.sendStatus(404);
}
} catch (e) {
console.log(e);
res.sendStatus(500);
}
});
我需要帮助完成交易,我尝试了以下方法:
const express = require('express');
const router = express.Router();
const mongoose = require('mongoose');
const User = require('./login').User;
mongoose.connect('mongodb://localhost:27017/animationsdb');
router.get('/', async(req, res) => {
// implement transactions
try {
const session = await mongoose.startSession();
session.startTransaction();
const result = await User.findOne({ username: req.query.username }).session(session);
if (result) {
console.log("Liked animations:", result.likedAnimations);
res.send({ animationList: result.likedAnimations });
} else {
console.log("no database result found");
res.sendStatus(404);
}
await session.commitTransaction();
session.endSession();
} catch (e) {
console.log(e);
res.sendStatus(500);
}
});
但是它不起作用。
我还尝试在连接字符串中添加?replicaSet=rs
,并安装?retryWrites=false
npm install run-rs -g
但是这些都不起作用尝试在会话之外发送响应。在
等待session.commitTransaction()之后代码>
也试着从这个问题中找出答案
不要在连接字符串中使用localhost或127.0.0.1作为主机名。如果使用Windows,请改用计算机名,并在末尾添加?replicset=rs
rs
是副本集的名称
另外,不要忘记将&retryWrites=false
添加到连接字符串中
使用运行rs-v 4.0.0
启动副本集。尝试在会话之外发送响应。在等待session.commitTransaction()之后代码>
也试着从这个问题中找出答案
不要在连接字符串中使用localhost或127.0.0.1作为主机名。如果使用Windows,请改用计算机名,并在末尾添加?replicset=rs
rs
是副本集的名称
另外,不要忘记将&retryWrites=false
添加到连接字符串中
使用运行rs-v 4.0.0
启动副本集。这是一个GET操作,为什么需要在那里执行事务?这是一个GET操作,为什么您需要在那里进行事务处理?我再次遇到此错误:``get/animation list/?username=marko 500 6.382 ms-21 MongoError:事务编号仅允许在副本集成员或mongos上使用``您是否连接到mongodb Atlas群集?我在本地主机上mongoose.connect('mongodb://localhost:27017/animationsdb');代码>我编辑了我的答案。在我上面发布的链接中似乎有一个很好的解决方案。我也尝试了你现在发布的解决方案,但它不适用于meI再次出现此错误:``get/animation list/?username=marko 500 6.382 ms-21 MongoError:事务号仅允许在副本集成员或mongos上使用``您是否连接到mongodb Atlas群集?我在本地主机上mongoose.connect('mongodb://localhost:27017/animationsdb');代码>我编辑了我的答案。在我上面发布的链接中似乎有一个很好的解决方案。我也尝试了你现在发布的解决方案,但它对我不起作用