【问题标题】:Nodejs Mongodb - Document Property is 'Undefined ' when printingNodejs Mongodb - 打印时文档属性为“未定义”
【发布时间】:2021-02-04 10:17:38
【问题描述】:

我正在学习 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 的方式是正确的,但不知道为什么它给我 undefined。

我在执行 Promise 时错了吗?

请帮忙。

非常感谢,

贾维德·安萨里

【问题讨论】:

  • 您在async / await 函数中返回了一个承诺new Promise,甚至没有在.findOne() 上使用它。在那里你使用一些不同的方法。您使用旧的回调方法。有很多反模式应该避免
  • @Ifaruki 我是 nodejs 的初学者。你能和我分享一些教程,我可以学习在nodejs中编写代码的有效方法吗?
  • 这里stackoverflow.blog/2019/09/12/…忘记了“打字稿”在这里你可以忽略它

标签: javascript node.js mongodb express promise


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您应该将await 添加到查询中,因为它返回一个承诺,如下所示

    return new Promise( async (resolve, reject) => {
    let tool_exist = await toolsModel.findOne({ title: req.body.inpTool });
    

    【讨论】:

    • 感谢您的解决方案。尝试了您的建议,但给了我一个错误,因为“等待仅在异步函数中有效”
    • 然后让它异步return new Promise( async (resolve, reject) => {
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多