【发布时间】: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