检查API服务调用上的重复项
因此,在这种情况下,我想检查数据库中已经存在的重复名称,但是我们正在使用API调用来呈现前端并保存表单。所以在这里我想在保存表单时检查数据库中是否已经存在该名称。如果我从名称中保存表单-如果数据库中已经存在ABC,则会显示类似已存在的错误。
let conn = null;
const constants = require('common/constants');
const db = require('common/database');
const api_respose = require('common/api_response');
const user_model = require('models/user_model');
var ObjectID = require('mongodb').ObjectID;
const audit_log = require('common/audit_log_common');
function saveCompany(company, isDelete, userId) {
return new Promise((resolve, reject) => {
let result = {};
result.error = null;
result.res = null;
try {
let isAdd = false;
let useridObj = new ObjectID(userId);
let user = conn.model(constants.collectionName.user, user_model.userSchema, constants.collectionName.user);
user.findById(useridObj).exec(function (uerr, user) {
if (uerr) {
console.error(uerr);
let resp = api_respose.getBadRequestResponse(process.env.WEB_URI, uerr.message);
resolve(resp);
}
var cModel = conn.model(constants.collectionNamepany, company_modelpanySchema, constants.collectionNamepany);
if (!company._id) {
company.createdDate = new Date(Date.now()).toLocaleString();
company.createdBy = user.name;
isAdd = true;
}
company.modifiedDate = new Date(Date.now()).toLocaleString();
company.modifiedBy = user.name;
let id = new ObjectID(company._id);
cModel.findById(id).exec(function (err, res) {
if (err) {
console.error(err);
let resp = api_respose.getBadRequestResponse(process.env.WEB_URI, err.message);
resolve(resp);
}
if (!res) {
if (isAdd) {
res = new cModel();
}
else {
result.error = "Project was not found with id: " + company._id;
console.error("Project was not found with id: " + company._id);
let resp = api_respose.getNotFoundResponse(process.env.WEB_URI, result.error);
resolve(resp);
}
}
var lean = JSON.stringify(res);
res.name = company.name;
res.is_deleted = isDelete ? true : company.is_deleted;
res.is_registered_for = company.is_registered_for;
res.registered_by= company.registered_by;
res.save({ lean: true }, function (tterr, update) {
if (tterr) {
console.error(tterr);
let resp = api_respose.getBadRequestResponse(process.env.WEB_URI, tterr.message);
resolve(resp);
}
if (update) {
if(res.name === company.name){
}
if (isAdd) {
audit_log.logObjectChanges({}, company, user, constants.auditLogActionpany, conn);
}
else {
audit_log.logObjectChanges(JSON.parse(lean), isDelete ? {} : company, user, constants.auditLogActionpany, conn);
}
result.res = update;
let resp = api_respose.getSuccessResponse(process.env.WEB_URI, result);
resolve(resp);
}
});
});
});
}
catch (e) {
console.error(e);
let resp = api_respose.getBadRequestResponse(process.env.WEB_URI, e.message);
resolve(resp);
}
});
}
exports.handler = async (event, context, callback) => {
if (event.httpMethod && event.httpMethod == "OPTIONS") {
let response = api_respose.getPreflightCorsVallidation(process.env.WEB_URI, event);
context.succeed(response);
return;
}
context.callbackWaitsForEmptyEventLoop = false;
if (!conn) {
conn = await db.connectToDB(process.env.MONGODB_URI);
}
}
var params = { company: '', isDelete: false, userId: '' };
if (event.body) {
let rec = JSON.parse(event.body);
paramspany = recpany;
params.userId = rec.userId;
params.isDelete = rec.isDelete;
}
else {
paramspany = eventpany;
params.userId = event.userId;
params.isDelete = event.isDelete;
}
let result = null;
result = await saveCompany(paramspany, params.isDelete, params.userId);
console.log("Final Result on Insert: ", JSON.stringify(result));
return result;
};
这里的参数是用户ID,数据将以JSON传递,因此当数据库中已经存在一个名称,应该显示它已经存在。我将ReactJS用于前端,使用响应状态(而非Redux)进行渲染。
回答如下:您可以为此目的使用unique indexes:
唯一索引可确保索引字段不会存储重复值
例如,如果您在用户名上创建唯一索引:
db.test.createIndex( { "username": 1 }, { unique: true } )
如果您尝试插入重复的用户名,则会引发错误。捕获此错误将告诉您新用户名已经存在:
replset:PRIMARY> db.test.insert({username: 'abc'})
WriteResult({ "nInserted" : 1 })
replset:PRIMARY> db.test.insert({username: 'abc'})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: test.test index: username_1 dup key: { username: \"abc\" }"
}
})
[请确保您仔细阅读behaviour部分,因为它列出了与唯一索引有关的所有警告(尤其是分片群集,null
值等)。
检查API服务调用上的重复项
因此,在这种情况下,我想检查数据库中已经存在的重复名称,但是我们正在使用API调用来呈现前端并保存表单。所以在这里我想在保存表单时检查数据库中是否已经存在该名称。如果我从名称中保存表单-如果数据库中已经存在ABC,则会显示类似已存在的错误。
let conn = null;
const constants = require('common/constants');
const db = require('common/database');
const api_respose = require('common/api_response');
const user_model = require('models/user_model');
var ObjectID = require('mongodb').ObjectID;
const audit_log = require('common/audit_log_common');
function saveCompany(company, isDelete, userId) {
return new Promise((resolve, reject) => {
let result = {};
result.error = null;
result.res = null;
try {
let isAdd = false;
let useridObj = new ObjectID(userId);
let user = conn.model(constants.collectionName.user, user_model.userSchema, constants.collectionName.user);
user.findById(useridObj).exec(function (uerr, user) {
if (uerr) {
console.error(uerr);
let resp = api_respose.getBadRequestResponse(process.env.WEB_URI, uerr.message);
resolve(resp);
}
var cModel = conn.model(constants.collectionNamepany, company_modelpanySchema, constants.collectionNamepany);
if (!company._id) {
company.createdDate = new Date(Date.now()).toLocaleString();
company.createdBy = user.name;
isAdd = true;
}
company.modifiedDate = new Date(Date.now()).toLocaleString();
company.modifiedBy = user.name;
let id = new ObjectID(company._id);
cModel.findById(id).exec(function (err, res) {
if (err) {
console.error(err);
let resp = api_respose.getBadRequestResponse(process.env.WEB_URI, err.message);
resolve(resp);
}
if (!res) {
if (isAdd) {
res = new cModel();
}
else {
result.error = "Project was not found with id: " + company._id;
console.error("Project was not found with id: " + company._id);
let resp = api_respose.getNotFoundResponse(process.env.WEB_URI, result.error);
resolve(resp);
}
}
var lean = JSON.stringify(res);
res.name = company.name;
res.is_deleted = isDelete ? true : company.is_deleted;
res.is_registered_for = company.is_registered_for;
res.registered_by= company.registered_by;
res.save({ lean: true }, function (tterr, update) {
if (tterr) {
console.error(tterr);
let resp = api_respose.getBadRequestResponse(process.env.WEB_URI, tterr.message);
resolve(resp);
}
if (update) {
if(res.name === company.name){
}
if (isAdd) {
audit_log.logObjectChanges({}, company, user, constants.auditLogActionpany, conn);
}
else {
audit_log.logObjectChanges(JSON.parse(lean), isDelete ? {} : company, user, constants.auditLogActionpany, conn);
}
result.res = update;
let resp = api_respose.getSuccessResponse(process.env.WEB_URI, result);
resolve(resp);
}
});
});
});
}
catch (e) {
console.error(e);
let resp = api_respose.getBadRequestResponse(process.env.WEB_URI, e.message);
resolve(resp);
}
});
}
exports.handler = async (event, context, callback) => {
if (event.httpMethod && event.httpMethod == "OPTIONS") {
let response = api_respose.getPreflightCorsVallidation(process.env.WEB_URI, event);
context.succeed(response);
return;
}
context.callbackWaitsForEmptyEventLoop = false;
if (!conn) {
conn = await db.connectToDB(process.env.MONGODB_URI);
}
}
var params = { company: '', isDelete: false, userId: '' };
if (event.body) {
let rec = JSON.parse(event.body);
paramspany = recpany;
params.userId = rec.userId;
params.isDelete = rec.isDelete;
}
else {
paramspany = eventpany;
params.userId = event.userId;
params.isDelete = event.isDelete;
}
let result = null;
result = await saveCompany(paramspany, params.isDelete, params.userId);
console.log("Final Result on Insert: ", JSON.stringify(result));
return result;
};
这里的参数是用户ID,数据将以JSON传递,因此当数据库中已经存在一个名称,应该显示它已经存在。我将ReactJS用于前端,使用响应状态(而非Redux)进行渲染。
回答如下:您可以为此目的使用unique indexes:
唯一索引可确保索引字段不会存储重复值
例如,如果您在用户名上创建唯一索引:
db.test.createIndex( { "username": 1 }, { unique: true } )
如果您尝试插入重复的用户名,则会引发错误。捕获此错误将告诉您新用户名已经存在:
replset:PRIMARY> db.test.insert({username: 'abc'})
WriteResult({ "nInserted" : 1 })
replset:PRIMARY> db.test.insert({username: 'abc'})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: test.test index: username_1 dup key: { username: \"abc\" }"
}
})
[请确保您仔细阅读behaviour部分,因为它列出了与唯一索引有关的所有警告(尤其是分片群集,null
值等)。