当我尝试在 MongoDB 中保存时,.then 未定义
Posted
技术标签:
【中文标题】当我尝试在 MongoDB 中保存时,.then 未定义【英文标题】:.then is undefined when I try to save in MongoDB 【发布时间】:2019-05-20 03:05:42 【问题描述】:我是 node.js 的新手。 我收到了这条消息:
TypeError: Cannot read property 'then' of undefined
代码如下:
router.post("/signup", (req, res) =>
const userRegister = new UserRegister(
_id: new mongoose.Types.ObjectId(),
nickname: req.body.nickname,
email: req.body.password,
password: req.body.password,
level: 0
);
console.log(req.body.nickname + " " + req.body.email + " " + req.body.password);
userRegister
.save()
.then(doc =>
console.log(doc);
res.status(200).json(
message: "User created"
);
)
.catch(err =>
if (err)
console.log("error => " + err)
res.status(409).json(
message: "ERROR"
)
);
);
和架构:
const mongoose = require("mongoose");
const userRegister = mongoose.Schema(
_id : mongoose.Schema.Types.ObjectId,
nickname: String,
email: String,
password: String,
level: Number
);
module.exports = mongoose.model("UserRegister", userRegister);
我真的不明白为什么它说“.then undefined”。 (身材不错)
【问题讨论】:
UserRegister
定义在哪里?
您好!我更新了你现在可以看到的帖子
更好的缩进会让它更容易阅读
你好,在代码里!
澄清一下,“.then”不是未定义的。它告诉你你试图调用“.then”的对象是未定义的,这是一条有价值的信息。 ".then" 将在 Promise 解析后使用,因此请尝试将 UserRegister 的声明包装在 Promise 中。
【参考方案1】:
函数“save”似乎没有返回 Promise。但在源代码中它确实...... https://github.com/Automattic/mongoose/blob/master/lib/model.js#L385
您也可以尝试“创建”方法。https://github.com/Automattic/mongoose/blob/master/lib/model.js#L2646
也许会很糟糕:
const result = new SomeModel(...);
new Promise((resolve, reject) =>
// Save model
result.save(err =>
if (err)
return reject(new Error(`Error with exam ersult save... $err`));
// Return saved model
return resolve(result);
)
.then(res =>
return res;
)
.catch(err =>
throw new Error(err);
);
【讨论】:
我也是这么理解的。我不知道为什么它不会返回一个承诺。这对我来说开始变得复杂了,我是 nodejs 的新手,使用 .save() 在我的脑海中很干净。正如我所说,在他使用的视频中,就像我使用自己一样,并且有效。【参考方案2】:检查模型是否是有前途的类型,如果这不是有前途的,则使用回调
mongoose promises
assert.ok(user instanceof Promise); // 这个返回 ture 或 false
router.post("/signup", (req, res) =>
const userRegister = new UserRegister(
_id: new mongoose.Types.ObjectId(),
nickname: req.body.nickname,
email: req.body.password,
password: req.body.password,
level: 0
);
console.log(req.body.nickname + " " + req.body.email + " " + req.body.password);
var user = userRegister.save()
assert.ok(user instanceof Promise);
// if assert.ok return true then use user.then
// else use callback userRegister.save( function(doc) )
user.then(doc =>
console.log(doc);
res.status(200).json(
message: "User created"
);
)
.catch(err =>
if (err)
console.log("error => " + err)
res.status(409).json(
message: "ERROR"
)
);
);
【讨论】:
在我跟随的tuto中,他不使用assert或任何类似的东西。它就像我写的那样有效。你可以在这里看到它在 15m57 youtube.com/… 我不知道断言的目标是什么。我在看【参考方案3】:router.post("/signup", async (req, res) =>
try
const userRegister = await UserRegister.create(
_id: new mongoose.Types.ObjectId(),
nickname: req.body.nickname,
email: req.body.password,
password: req.body.password,
level: 0
);
catch(err)
console.log("error => " + err)
res.status(409).json(
message: "ERROR"
)
console.log(userRegister);
res.status(200).json(
message: "User created"
);
);
【讨论】:
您好,谢谢您的回答。它应该可以工作,但我想要带有 .then 的版本来回答它是如何工作的。我已经知道等待了! @dun32 不,他们没有。它不会在router.post()
之前出现。以上是关于当我尝试在 MongoDB 中保存时,.then 未定义的主要内容,如果未能解决你的问题,请参考以下文章
我无法使用 Mongoose 在 MongoDB 中保存或查找文档
我定义了嵌套模式,当我填充输入时它啥也不返回,也不保存在 Mongodb
类型“RelayObservable<unknown>”上不存在属性“then”。当我尝试在反应中使用中继获取数据时。我不知道为啥会出现这个错误