首页 > 解决方案 > 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 错误?

请帮忙。

非常问候,

贾维德·安萨里

标签: javascriptnode.jsmongodbexpresspromise

解决方案


我能够解决这个问题。如果有人遇到同样的问题,请列出完整的代码。非常感谢 @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');            
        }
    }

推荐阅读