Nodejs开发指南:为什么一个用户只能发表一条信息
Nodejs开发指南:为什么一个用户只能发表一条信息
Post.prototype.save = function save(callback) { // 存入 Mongodb 的文檔 var post = { user: this.user, post: this.post, time: this.time };
mongodb.open(function(err, db) {
if (err) {
return callback(err);
}
db.collection('posts', function(err, collection) {
if (err) {
mongodb.close();
return callback(err);
}
collection.ensureIndex('user',{unique: true},{w: 0});
collection.insert(post, {safe: true}, function(err, post) {
mongodb.close();
callback(err, post);
});
});
});
};
exports.post = function(req, res) {
var currentUser = req.session.user;
var post = new Post(currentUser.name, req.body.post);
post.save(function(err) {
if (err) {
//console.log(‘123’);
req.flash(‘error’, err);
return res.redirect(’/’);
}
req.flash(‘success’, ‘发表成功’);
res.redirect(’/u/’ + currentUser.name);
});
};
插入第一条是好用的,第二条就插入不进去了 注册了几个用户 都是只能插入一条
插入第二条的时候 就走我注释那个console.log(‘123’)了;
看这本书的亲们有遇到这个情况吗
希望高手能帮忙解答一下
Node.js 开发指南:为什么一个用户只能发表一条信息
在Node.js应用中,有时我们会遇到一种需求:限制每个用户只能发布一条信息。这可以通过在数据库中为用户设置唯一索引来实现。然而,在实际操作过程中,可能会出现一些问题,导致用户只能发布一条信息。
让我们来看一个具体的例子,假设我们有一个Post
模型,用于存储用户的帖子信息。以下是一个简单的实现:
// 定义 Post 模型
const mongoose = require('mongoose');
const postSchema = new mongoose.Schema({
user: { type: String, required: true },
post: { type: String, required: true },
time: { type: Date, default: Date.now }
});
postSchema.index({ user: 1 }, { unique: true });
const Post = mongoose.model('Post', postSchema);
module.exports = Post;
接下来,我们在控制器中处理保存帖子的逻辑:
const Post = require('./models/post'); // 假设你已经定义好了 Post 模型
exports.post = async (req, res) => {
const currentUser = req.session.user;
try {
const newPost = new Post({
user: currentUser.name,
post: req.body.post
});
await newPost.save();
req.flash('success', '发表成功');
res.redirect(`/u/${currentUser.name}`);
} catch (err) {
req.flash('error', err.message);
res.redirect('/');
}
};
在这个例子中,我们使用了Mongoose来定义Post
模型,并且在模型中设置了user
字段的唯一索引。这意味着每个用户只能创建一条记录。
问题分析
如果你发现用户只能发布一条信息,可能是因为以下几个原因:
- 唯一索引冲突:如果用户已经发布了一条信息,再次尝试发布时会因为唯一索引冲突而失败。
- 错误处理不当:在保存数据时,错误处理不够完善,导致无法正确显示错误信息。
示例代码解析
在上面的代码中,我们首先定义了一个Post
模型,并设置了user
字段的唯一索引。然后,在控制器中,我们创建了一个新的Post
实例,并调用save
方法来保存数据。
如果保存过程中发生错误(例如唯一索引冲突),catch
块会捕获该错误,并将错误信息通过req.flash
传递给视图层进行展示。
解决方案
如果你希望允许每个用户发布多条信息,可以删除或修改唯一索引:
// 删除唯一索引
postSchema.index({ user: 1 });
// 或者允许重复
postSchema.index({ user: 1 }, { unique: false });
这样,每个用户就可以发布多条信息了。
希望这个解决方案能够帮助到你!如果你还有其他问题,欢迎继续讨论。
能具体点吗 俺是新手 谢谢啦
应该有很多跟着写这个示例的吧 大家的都有没有这个问题呢
根据你的描述,问题出在 collection.ensureIndex('user',{unique: true},{w: 0});
这一行。这条语句为 user
字段创建了一个唯一索引(Unique Index),这意味着同一个用户的记录在数据库中只能存在一条。
解决方案
方案一:移除唯一索引
如果你希望每个用户可以发布多条信息,那么你需要移除唯一索引,或者修改索引的条件。
collection.ensureIndex('user', { w: 0 });
方案二:允许更新
如果你希望每个用户只能有一条信息,但这条信息可以更新,那么你可以检查是否有该用户的记录,如果有则更新,否则插入新记录。
Post.prototype.saveOrUpdate = function saveOrUpdate(callback) {
var post = {
user: this.user,
post: this.post,
time: this.time
};
mongodb.open(function(err, db) {
if (err) {
return callback(err);
}
db.collection('posts', function(err, collection) {
if (err) {
mongodb.close();
return callback(err);
}
// 查找当前用户是否存在记录
collection.findOne({ user: this.user }, function(err, doc) {
if (doc) {
// 如果存在记录,则更新
collection.update({ user: this.user }, { $set: post }, function(err, result) {
mongodb.close();
callback(err, result);
});
} else {
// 否则插入新记录
collection.insert(post, { safe: true }, function(err, post) {
mongodb.close();
callback(err, post);
});
}
});
});
});
};
exports.post = function(req, res) {
var currentUser = req.session.user;
var post = new Post(currentUser.name, req.body.post);
post.saveOrUpdate(function(err) {
if (err) {
req.flash('error', err);
return res.redirect('/');
}
req.flash('success', '发表成功');
res.redirect('/u/' + currentUser.name);
});
};
通过以上代码,你可以实现一个用户只能有一条信息,并且可以更新这条信息。如果需要删除唯一索引,只需要移除或修改 ensureIndex
中的参数即可。