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’)了; 看这本书的亲们有遇到这个情况吗
希望高手能帮忙解答一下


5 回复

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字段的唯一索引。这意味着每个用户只能创建一条记录。

问题分析

如果你发现用户只能发布一条信息,可能是因为以下几个原因:

  1. 唯一索引冲突:如果用户已经发布了一条信息,再次尝试发布时会因为唯一索引冲突而失败。
  2. 错误处理不当:在保存数据时,错误处理不够完善,导致无法正确显示错误信息。

示例代码解析

在上面的代码中,我们首先定义了一个Post模型,并设置了user字段的唯一索引。然后,在控制器中,我们创建了一个新的Post实例,并调用save方法来保存数据。

如果保存过程中发生错误(例如唯一索引冲突),catch块会捕获该错误,并将错误信息通过req.flash传递给视图层进行展示。

解决方案

如果你希望允许每个用户发布多条信息,可以删除或修改唯一索引:

// 删除唯一索引
postSchema.index({ user: 1 });

// 或者允许重复
postSchema.index({ user: 1 }, { unique: false });

这样,每个用户就可以发布多条信息了。

希望这个解决方案能够帮助到你!如果你还有其他问题,欢迎继续讨论。


Markdown 标记出错… 楼主

能具体点吗 俺是新手 谢谢啦

应该有很多跟着写这个示例的吧 大家的都有没有这个问题呢

根据你的描述,问题出在 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 中的参数即可。

回到顶部