gpt4 book ai didi

javascript - Mongoose FindOne 在创建后无法直接工作

转载 作者:行者123 更新时间:2023-12-03 08:57:07 25 4
gpt4 key购买 nike

我正在设置种子数据,目的是仅在记录尚不存在时创建记录。

我正在使用https://www.npmjs.com/package/mongoose-find-one-or-create插件仅在记录不存在且不起作用时创建记录。

我还调试了他们的代码并编写了我自己的测试,执行以下操作。

  • 创建记录 - 名称 = 'Abc'
  • 查找 Name = 'Abc' 的记录
  • 如果找到
  •     找到打印品
  • 如果没有找到
  •     创建记录 - 名称 = 'Xyz'

我本来希望看到消息“找到”,但我收到了一条名为“Xyz”的新记录

我有一种感觉,这可能是某种异步问题,但我是 mongo 新手,所以不太确定。

这是我所有的测试代码,加上 plugin 中的代码.

帐户表的方案定义

'use strict';

var mongoose = require('mongoose');
var findOneOrCreate = require('mongoose-find-one-or-create');

var Schema = mongoose.Schema;

var AccountSchema = new Schema({
name: String,
type: String,
notes: String,
locationIds: String,
});


AccountSchema.plugin(findOneOrCreate);

module.exports = mongoose.model('Account', AccountSchema);

用于创建新行的种子文件

'use strict';

var Account = require('../../api/account/account.model');

Account.create({ name: 'Abc' }, function (err, small) {
});

Account.findOne({ name: 'Abc' }, function (err, row) {

console.log("Inside Find One");
if (row) {
console.log("Found: Yes");
console.log(row);
} else {
console.log("NOT FOUND");
Account.create({ name: 'Xyz' }, function (err, small) {
});
}
});

FindOneOrCreatePlugin 代码

'use strict';

/**
* Mongoose Plugin: findOneOrCreate
* Copyright(c) 2014 Mohammad Khan <mohammad.khan@gmx.us>
* MIT Licensed
**/

function findOneOrCreatePlugin(schema) {
//console.log('findOneOrCreatePlugin: SETUP');
schema.statics.findOneOrCreate = function findOneOrCreate(condition, doc, callback) {
var self = this;
//console.log('CONDITION');
//console.log('----------------------------------------------------------------------------------------------------');
//console.log(condition);
//console.log('----------------------------------------------------------------------------------------------------');

self.findOne(condition, function(err, result ) {
//console.log('ERROR');
//console.log('----------------------------------------------------------------------------------------------------');
//console.log(err);
//console.log('----------------------------------------------------------------------------------------------------');
//console.log('RESULT');
//console.log('----------------------------------------------------------------------------------------------------');
//console.log(result);
//console.log('----------------------------------------------------------------------------------------------------');

if (result) {
//console.log('----------------------------------------------------------------------------------------------------');
//console.log('YEEEEEEEEEEEEEEY an UPDATE');
//console.log('----------------------------------------------------------------------------------------------------');

callback(err, result);
} else {
//console.log('CREATE');
//console.log('----------------------------------------------------------------------------------------------------');
//console.log(doc);
//console.log('----------------------------------------------------------------------------------------------------');

self.create(doc, function(err, result) {
callback(err, result);
});
}
});
};
}

module.exports = findOneOrCreatePlugin;

在 Mongo Shell 中查询

Mongo Shell Output

Web 服务器中的控制台输出

Console Output in Web Server

**这是我尝试处理的用例**

注意:这是最终用户使用

生成的一组文件的一部分

我试图解决的用例是用户不小心将同一个帐户输入两次。

此代码本质上是为了在用户意外放入重复项时进行 self 修复,它只是用于填充新应用程序的种子系统。

我确实计划在包含 1000 种产品的产品表上使用它。

根据 @RobertMoskal,我需要将调用放在回调函数中,但随后我将拥有巨大的嵌套回调,每个产品 1 个。

// Create account called 'Chicane'
Account.findOneOrCreate(
{ name: 'Chicane'},
{
name: 'Chicane',
type: 'Orderer',
},
function (err, account) {
console.log('Account.findOneOrCreate');
console.log(account);
}
);

// Create account called 'Campos'
Account.findOneOrCreate(
{ name: 'Campos'},
{
name: 'Campos',
type: 'Supplier',
},
function (err, account) {
console.log('Account.findOneOrCreate');
console.log(account);
}
);

// Create account called 'Chicane', this has already been created so it should NOT be created again, but it is
Account.findOneOrCreate(
{ name: 'Chicane'},
{
name: 'Chicane',
type: 'Orderer',
},
function (err, account) {
console.log('Account.findOneOrCreate');
console.log(account);
}
);

最佳答案

经典的节点错误。您必须在 create 函数的回调中调用 findOne 函数,否则它将在 create 函数完成之前被调用。所以像这样:

Account.create({ name: 'Abc' }, function (err, small) {
if(err)...;
Account.findOne({ name: 'Abc' }, function (err, row) {...
});
});

使用 findOneOrCreate 插件天真地加载数千个项目将导致回调 hell 。但是您可以看到该过程的重复性,您可以使用异步库之类的东西来确保代码按顺序运行:

async.series([
function(cb){ Account.findOneOrCreate({...})},
function(cb){ { Account.findOneOrCreate({...}, cb)}
]);

关于javascript - Mongoose FindOne 在创建后无法直接工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32446803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com