开发者问题收集

如果不保存新项目,findOneAndUpdate 不起作用(Mongoose,Node.js)

2018-11-15
225

尝试使用 Mongoose 将一些对象发送到数据库。 即,我获取搜索查询并将其保存到数据库,并记录唯一条目数。

这是我的架构:

const entrySchema = mongoose.Schema({
    searchWord: { type: String, required: true, unique: true},
    numEntries:{type:Number,default:0},
  });

  const entry = module.exports = mongoose.model('entry', entrySchema);

这是我使用的方法:

searchRouter.post('/search', (req, res) => {
    let entry = new SearchEntry();

    SearchEntry.findOneAndUpdate({ searchWord: req.body.searchWord },
        { $inc: { numEntries: 1 } },
        { new: true }, (err, response) => {
            if (err) {
                console.log(err);
            }
            if (!response.length) {
                entry.searchWord = req.body.searchWord;
                SearchEntry.save((err) => {
                    if (err) {
                        console.log(err);
                    }
                })
            }
        })
});

现在,当我尝试使用 postman 测试它时,控制台中会显示错误:

TypeError:无法读取 null 的属性“length”

有人知道我做错了什么吗?

P.S. REST 客户端响应“无法访问请求的 URL”, 但是我们找到了所需的路由,并且正在启动 post 方法。

2个回答

响应可能为空,而不是空字符串、对象或对象数组,并且您无法获取空长度,因为空不是字符串或对象数组,因此您必须检查响应是否!=空,然后测试长度。

Hedi Lahouar
2018-11-15

在您的帮助下终于找到了解决方案:

searchRouter.post('/search', (req, res) => {

let entry = new SearchEntry();

SearchEntry.findOneAndUpdate({ searchWord: req.body.searchWord },
    { $inc: { numEntries: 1 } },
    { new: true }, (err, response) => {
        if (err) {
            console.log('find error ', err);
        }
        if (response === null) {
            console.log('here');
            entry.searchWord = req.body.searchWord;
            console.log(entry);

            entry.save((err) => {
                if (err) {
                    console.log('save error', err);
                }
            })
        }
    })

    res.send('done');

});

Dominik Domanski
2018-11-15