【问题标题】:MongoDB does not update record and promise keeps fail after multi or upsert is set to true在 multi 或 upsert 设置为 true 后,MongoDB 不更新记录并且承诺保持失败
【发布时间】:2017-11-11 04:58:37
【问题描述】:

我在更新 MongoDB 中的记录时遇到了麻烦(使用 mongoose)。我的代码有效但不更新记录。请看下面的代码:

edit(req, res, next) {
var WorkType = require('../models/WorkType');
WorkType.update({id: req.params.id}, {name: req.body.name}, false, false)
    .then(workType => {
        res.send(200, {message: 'Work Type updated successfully'});
    })
    .catch(err => {
        return next(err);
    })
}

此代码运行,但不更新数据库中的信息。 POSTMAN 请求返回 HTTP 状态 200 OK 并显示消息:

{ "message": "工作类型更新成功" }

当我将代码更改为此

WorkType.update({id: req.params.id}, {name: req.body.name}, false, true)

我遇到了这个错误:

TypeError: 无法读取未定义的属性“then”

投掷者; // 未处理的“错误”事件

TypeError: callback.apply 不是函数

如果我将代码更改为这个:

WorkType.update({id: req.params.id}, {name: req.body.name}, true, false)

我有错误:

TypeError: 不能使用 'in' 运算符在 true 中搜索 'strict'

你能帮我找出问题出在哪里,或者为什么 promise 不适用于第二个代码吗?非常感谢您的帮助!


WorkType.js

var mongoose = require('mongoose');

var WorkTypeSchema = new mongoose.Schema({
name: {
    type: String,
    unique: true,
    required: true
}
})

var WorkType = mongoose.model('WorkType', WorkTypeSchema);

module.exports = WorkType;

【问题讨论】:

  • 如果您可以分享WorkType.update(它可以是简单的定义)以了解它的运行方式以及为什么会出现这些错误,这将很有帮助,这些错误目前显示为错误的实现或代码中有一些错字。
  • update() 是一个标准的 MongoDB 函数 -> docs.mongodb.com/manual/reference/method/db.collection.update
  • 我会检查自定义模块../models/WorkType 是否正确实现了数据库调用。
  • 我已经编辑了我的 OP,以便您查看。谢谢

标签: javascript node.js mongodb


【解决方案1】:

update 方法的签名是:

Model.update(conditions, update, options, callback)

如果你想使用 Promise,那么你不应该传递回调,这样 Mongoose 就会知道返回一个 Promise。但是,您在此处为回调参数传递值 true

WorkType.update({ id: req.params.id }, { name: req.body.name }, false, true)

options 参数应为 object 类型,但您在此处传递值 true

WorkType.update({ id: req.params.id }, { name: req.body.name }, true, false)

您可以将对象作为选项参数传递,例如:

{ multi: true, upsert: true }

optionscallback 参数传递 false,就像在您的原始代码中一样,应该可以工作,因为如果不是 真相。

【讨论】:

  • 感谢您的帮助,我更改了它,现在 Promises 正在运行。但字段名称不会改变。我得到 HTTP 状态 200 OK,但没有改变:(
  • 哦,我的错。 Mongo 将 ID 作为 _id 发送,所以我将其更改为 WorkType.update({_id: req.params.id}, {name: req.body.name}, { multi: false, upsert: false }) 现在它正在工作!
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2015-01-08
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
相关资源
最近更新 更多