gpt4 book ai didi

node.js - Mongoose/mongo 将 findOne 存储到变量中

转载 作者:太空宇宙 更新时间:2023-11-04 03:02:57 26 4
gpt4 key购买 nike

我需要执行 findOne 并将结果保存到变量中以插入另一个集合中。 问题是在函数内部我有结果,而外部只是空的。

var rest = [];

function queryCollection(collection, callback, city){
collection.findOne({cidade: city},function(err, result) {
k = 1
if (err) {
console.log(err);
} else if (k > 0) {
console.log(result)//here have result
rest.push(result);
callback();
console.log(rest)//here have result
k - 1;
}
});
}

queryCollection(Location, function(){
console.log(rest);
}, 'FATIMA');
console.log('out', rest)//HERE IS EMPTY, HOW CAN I USE REST VALUE?

最佳答案

这里有一些关于 javascript 的注意事项以及一些使用 mongoose 的示例。希望对您有所帮助!

  1. Javascript 不一定会按照语句在源代码中出现的顺序运行您的代码。
  2. 您在 mongoose 中执行的任何连接到数据库的操作都将是异步的。

根据您的问题宽松地考虑这个人为的示例:

'use strict';

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
const Schema = mongoose.Schema;

const testSchema = new Schema({
city: String
});

const Test = mongoose.model('test', testSchema);

const test = new Test({
city: 'Tucson'
});

function queryCollection() {
console.log('queryCollection');
Test.findOne({ city: test.city }, function (err, result) {
console.log('findOne callback');
if (err) {
return console.error(err);
} else {
console.log(`result: ${result}`);
}
});
}

test.save(function (err, doc) {
console.log('save callback');
if (err) { return console.error(err); }
queryCollection();
});

console.log('console.log');

shell 输出

stack: node ./49738064.js
console.log
save callback
queryCollection
findOne callback
result: { _id: 5acbd819e89388d34ea8d6a1, city: 'Tucson', __v: 0 }
^C
stack:

请注意,脚本的第一个输出是“console.log”这是因为 test.save()Test.findOne() 是异步操作,这意味着它们需要时间来完成,而 javascript 不会等待。

从网络、磁盘或数据库读取或写入的函数通常称为“异步”,除非另有说明/命名。您需要在代码中考虑同步和异步操作的混合。

从历史上看,这是通过回调完成的。如果有一些异步操作,则会将回调传递到该操作中,该操作将处理异步调用的结果。

回到上面我们设计的例子:

'use strict';

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
const Schema = mongoose.Schema;

const testSchema = new Schema({
city: String
});

const Test = mongoose.model('test', testSchema);

const test = new Test({
city: 'Tucson'
});

function queryCollection(done) {
Test.findOne({ city: test.city }, function (err, result) {
if (err) {
return console.error(err);
} else {
done(result);
}
});
}

test.save(function (err, doc) {
if (err) { return console.error(err); }
queryCollection(console.log);
});

如您所见,我传入了 console.log 函数作为异步查询操作的回调。您也可以编写自己的函数并将它们传入。

shell 输出

stack: node ./49738064.js
{ _id: 5acbd819e89388d34ea8d6a1, city: 'Tucson', __v: 0 }
^C
stack:

处理异步操作的更现代的方法是使用 Promise。 A Promise是一个对象,代表您正在执行的操作的 future 结果。

如果您不传入回调,则默认情况下所有 mongoose 异步操作都会返回一个 Promise(或类似 Promise 的对象)。因此,它们可以非常有效地与 async/await 一起使用。

这是使用 async wait 与 mongoose 的示例:

'use strict';

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
const Schema = mongoose.Schema;

const testSchema = new Schema({
city: String
});

const Test = mongoose.model('test', testSchema);

const test = new Test({
city: 'Tucson'
});

function queryCollection() {
return Test.findOne({ city: test.city });
}

async function run () {
await Test.remove({}); // remove all existing documents
await test.save(); // save the new document
let found = await queryCollection();
console.log(found);
}

run();

shell 输出

stack: node ./49738064.js
{ _id: 5acbdf5dd8dc39d6065c820c, city: 'Tucson', __v: 0 }
^C
stack:

关于node.js - Mongoose/mongo 将 findOne 存储到变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49738064/

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