javascript - Nodejs Mongodb - 打印时文档属性为“未定义”
问题描述
我正在学习 Node、Express 和 Mongodb,因此非常适合初学者。我正在开发一个表单,其中有一个文本字段,用户将在其中添加数据。
首先,我需要检查该数据是否存在于主表中。如果存在,那么我将返回记录 ID,否则我将创建一个新记录并返回其 ID。下面是我尝试过的代码,但它给了我未定义的 id。
code.js(控制器)
const toolsModel = require('../models/modTools');
const { validationResult } = require('express-validator');
module.exports = {
async saveCode(req, res)
{
var promiseToolId = () => {
return new Promise((resolve, reject) => {
let tool_exist = toolsModel.findOne({ title: req.body.inpTool });
if (tool_exist) {
console.log('tool_exist'); // prints this line
console.log(tool_exist._id); // gives undefined
console.log(tool_exist); // prints the object.
resolve(tool_exist._id);
}
else{
console.log('tool not exist. inserting');
var newTool = new toolsModel();
newTool.insert({title: req.body.inpTool, created_at: new Date()}, function(err, newRec) {
if(err){
console.log('err while inserting');
console.log(err);
reject(err);
}
else{
console.log('inserted');
console.log(newRec);
resolve(newRec._id);
}
});
}
});
};
let errors = validationResult(req);
if (!errors.isEmpty()){
console.log('validation error');
console.log(errors);
}
else{
console.log('form is valid'); // prints this line
// check if the tool exists in our database
var toolId = await (promiseToolId()); //anything here is executed after result is resolved
console.log('toolId ', toolId); // prints undefined
}
}
};
modTools.js(模型)
const mongoose = require('mongoose'),
timeZone = require('mongoose-timezone'),
Schema = mongoose.Schema;
const toolsSchema = new Schema({
title: {type:String, required:true, trim: true},
created_at: {type: Date, default: Date.now},
});
toolsSchema.plugin(timeZone);
module.exports = mongoose.model('developmentTools', toolsSchema);
请注意,我正在为我使用以下代码创建的模型使用自动增量 ID。
db.createCollection("developmentTools");
db.developmentTools.insert ( {_id: "toolsId" , toolSeqValue : 0 } );
function getToolsNextID(seqName) {
var seqDoc = db.developmentTools.findAndModify({
query: { _id: seqName },
update: { $inc: { toolSeqValue: 1 } },
new: true
});
return seqDoc.toolSeqValue;
}
我知道我访问对象属性tool_exist.title的方式是正确的,但不知道为什么它给我未定义。
MI 执行 Promise 错误?
请帮忙。
非常问候,
贾维德·安萨里
解决方案
我能够解决这个问题。如果有人遇到同样的问题,请列出完整的代码。非常感谢 @ifaruki 分享信息丰富的 URL 和 @slimane-amiar 的时间。
async saveCode(req, res)
{
async function createTool(tool_ttle){
var newTool = new toolsModel({
title: tool_ttle,
created_at: new Date()
});
return new Promise((resolve, reject) => {
newTool.save((err, newRec) => {
if(err){
console.log('err while inserting');
reject(err);
}
else{
console.log('inserted');
resolve(newRec);
}
});
});
}
let errors = validationResult(req);
if (!errors.isEmpty()){
console.log('validation error');
console.log(errors);
}
else{
console.log('form is valid');
toolTitle = req.body.inpTool;
toolTitle = toolTitle.trim().toUpperCase();
let toolRecord = '';
// check if the tool exists in our database
try {
toolRecord = await toolsModel.findOne({ title: toolTitle });
if (toolRecord){
console.log('tool_exist');
console.log(toolRecord);
}
else{
console.log('tool not exist. inserting');
toolRecord = await createTool(toolTitle);
if(toolRecord){
console.log('new tool is created below');
console.log(toolRecord);
}
else
{
console.log('error in creating new tool');
console.log(toolRecord);
}
}
}
catch(error){
console.log('in catch');
console.log(error);
return error;
}
console.log('proceeding further');
}
}
推荐阅读
- python - 用于 Python 中竞争性编程的快速 I/O
- javascript - 用js获取mp3文件频率数据
- python - 将上传的文件连接到 Django 中的帖子
- raspberry-pi4 - 通过 Raspberry Pi 上的 shell 启用可预测的网络接口
- flutter - 使用带有颤振的firebase将存档添加到应用程序
- node.js - 如何激活由在Node Js代码中配置了Stripe checkout的successUrl返回的角度前端路由
- java - 在后台线程中使用 Google Play 计费库 v3
- python - 如何在熊猫的范围内分组
- deployment - 未找到 gcloud beta 运行部署错误
- laravel - 重复图标 X 次