#javascript #node.js #mongodb #mongojs
#javascript #node.js #mongodb #mongojs
Вопрос:
async deleteRecipeById(recipeId){
try{
const client = new MongoClient(this.uriString);
await client.connect();
const db = client.db(this.databaseString);
const recipeCollection = db.collection(this.collectionString);
//console.log(await recipeCollection.find({recipeName:recipeName}).toArray());
var recipeIdAsObject = new ObjectId(recipeId);
var result = recipeCollection.deleteMany({"_id":recipeIdAsObject});
client.close();
return resu<
}
catch(e){
console.error(e);
}
}
Я тестирую свой драйвер mongo, но никогда в жизни не смогу понять, почему это не работает. Я запускаю тот же тест с моим deleteRecipeByName() и тест проходит. Итак, для меня это показывает, что мое устройство для тестирования в порядке. Это означает, что я знаю, что рецепт существует в базе данных с правильным идентификатором.
Перед запуском теста я даже вызываю функцию getRecipeByName, которую я уже тестировал, чтобы убедиться, что рецепт существует с тем идентификатором, который я ищу, и это результат.
[
{
_id: 0,
recipeName: 'mock0',
recipeIngredients: [ 'i0', 'i1', 'i2' ]
}
]
И вот моя тестовая функция
describe('Testing delete Recipe',()=>{
it('1. Delete known recipe',(done)=>{
var uri = "mongodb://localhost:27017";
var dbname = "testRecipes";
var collectionName = "testCollectionMessy";
let driver = new MongoDriver(uri,dbname,collectionName);
driver.dropCollection().then(()=>{//Clean collection for testing... NEVER CALL ON PRODUCTION COLLECTION
driver.addMockData().then((p)=>{
driver.getRecipeById(mockData[0]._id).then((p)=>{
console.log(p);
})
driver.deleteRecipeById(0).then((p)=>{
console.log(p);
console.log(mockData[0]._id);
assert.deepEqual(p.deletedCount,1);
done();
}).catch((e)=>{
console.log(e);
done(e);
})
});
});
})
})
и вот mockData, которые я импортирую из JSON
[
{"_id":0,"recipeName":"mock0","recipeIngredients":["i0","i1","i2"]},
{"_id":1,"recipeName":"mock1","recipeIngredients":["i0","i1","i2"]},
{"_id":2,"recipeName":"mock2","recipeIngredients":["ingredient"]}
]
Комментарии:
1. если вы запустите
new ObjectId(recipeId)
whererecipeId
is0, 1 or 2
, это выдаст ошибку2. Значит, у меня не может быть идентификаторов со значениями от 0-2?
3. Вам нужно избегать создания
recipeIdAsObject
и использованияreceipeId
напрямую4. Большое вам спасибо, это сработало. Мне нужно изменить мое тестовое устройство, поэтому я использую идентификаторы, которые больше похожи на мою производственную среду.
5. Добавлен ответ для поддержки обоих форматов
Ответ №1:
Проблема в том, как управляется receipeId.
new ObjectId(id)
выдает ошибку, если идентификатор не является допустимым идентификатором объекта mongo, поэтому вы можете добавить фрагмент для управления обоими форматами следующим образом:
async deleteRecipeById(recipeId){
try{
const client = new MongoClient(this.uriString);
await client.connect();
const db = client.db(this.databaseString);
const recipeCollection = db.collection(this.collectionString);
var recipeIdAsObject;
if(/^(?=[a-fd]{24}$)(d [a-f]|[a-f] d)/i.test(recipeId)){
recipeIdAsObject = new ObjectId(recipeId);
} else {
recipeIdAsObject = recipeId
}
var result = recipeCollection.deleteMany({"_id":recipeId});
client.close();
return resu<
}
catch(e){
console.error(e);
// it is dangerous to ignore errors
}
}
Я бы посоветовал выбрать только один формат, иначе может быть сложно выполнять запросы в разных приложениях.
Комментарии:
1. Вау, огромное вам спасибо! Я борюсь с регулярными выражениями, поэтому я действительно ценю ваш вклад!