Javascript Node.js&;MongoDB代码澄清
我正在编写一个教程: 我需要一些理解语法的帮助。代码如下:Javascript Node.js&;MongoDB代码澄清,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我正在编写一个教程: 我需要一些理解语法的帮助。代码如下: var mongo = require ('mongodb'); var Server = mongo.Server, Db = mongo.db, BSON = mongo.BSONPure; var server = new Server ('localhost', 27017, {auto_reconnet:true}); db = new Db('winedb', server); db.open(fu
var mongo = require ('mongodb');
var Server = mongo.Server,
Db = mongo.db,
BSON = mongo.BSONPure;
var server = new Server ('localhost', 27017, {auto_reconnet:true});
db = new Db('winedb', server);
db.open(function(err, db) {
if(!err) {
console.log("Connected to 'winedb' database");
//Q1. Why are we passing "collection" ? Where did we declare "collection"?
db.collection('wines', {strict:true}, function(err, collection) {
if (err) {
console.log("The 'wines' collection doesn't exist. Creating it with sample data...");
populateDB();
}
});
}
});
exports.findById = function(req, res)
{
var id = req.params.id;
console.log('Retrieving wine: ' + id);
//Q2. Why do we need to pass function as a parameter? Where is "collection" declared?
db.collection('wines', function(err, collection)
{
collection.findOne({'_id':new BSON.ObjectID(id)}, function(err, item)
{
res.send(item);
});
});
}
exports.findAll = function(req, res) {
db.collection('wines', function(err, collection) {
//Q3. Why do we not have to declare "items" anywhere?
collection.find().toArray(function(err, items) {
res.send(items);
});
});
};
三个问题:
问题1:为什么我们要通过“收集”?我们在哪里申报“收藏”
问题2:为什么我们需要将函数作为参数传递?“集合”在哪里声明
问题3:为什么我们不必在任何地方声明“items”?这种风格是必要的,因为node.js中涉及I/O(如数据库查询)的操作是异步的,因此这些操作的方法通过回调函数而不是返回值将结果返回给调用方
collection
和items
都是匿名回调函数的参数,作为参数传递给异步函数。您可以随意命名这些参数,因为它们在参数列表中的位置很重要。当异步结果可用时,将调用这些回调函数。此样式是必需的,因为node.js中涉及I/O(如数据库查询)的操作是异步的,因此这些操作的方法通过回调函数而不是返回值将结果返回给调用方
collection
和items
都是匿名回调函数的参数,作为参数传递给异步函数。您可以随意命名这些参数,因为它们在参数列表中的位置很重要。当异步结果可用时,将调用这些回调函数。A1:集合
是数据库对象
中的字段或属性
——它在此处声明
A2:db.collection('wines',函数(err,collection){}代码>我们将函数作为参数传递,因为这是回调模式
这意味着您将函数注册为侦听器,当db获取数据时,使用err或collection调用您的函数。如果操作成功,err将为空,并且您只接收到集合
A3:在A2集合eq项中描述A1:集合
是数据库对象中的字段或属性
——在此处声明
A2:db.collection('wines',函数(err,collection){}代码>我们将函数作为参数传递,因为这是回调模式
这意味着您将函数注册为侦听器,当db获取数据时,使用err或collection调用您的函数。如果操作成功,err将为空,并且您只接收到集合
A3:在A2集合中描述eq项目Q1:我们为什么要通过“集合”?我们在哪里申报“收藏”?
集合是在此行上创建的db对象的属性(方法):
db = new Db('winedb', server);
检查mongodb api以了解如何使用它
Q2:为什么我们需要将函数作为参数传递?“集合”在哪里声明?
数据库查询非常慢。程序在继续执行之前等待查询结果是没有意义的,因此查询与其他代码并行进行。您可能会看到这样的问题:如果执行在该点上分叉,如何获得查询结果?答案是回调
您需要将一个函数传递给collection方法,当结果就绪时它将调用该方法。结果将作为参数传递给函数。收集方法的一个非常简单的实现是:
function collection(name, callback) {
var result = // do stuff to get the result;
callback(result);
}
很明显,事情远不止这些,但这是主要思想
因此,概括一下:为了接收结果,您需要将函数作为参数传递。函数中的collection参数将由db.collection方法填充查询结果(如果没有错误)
Q3:为什么我们不必在任何地方申报“物品”?
这个问题暴露出对功能的理解不足
这是一个函数声明:
function foo(bar) {}
bar就在这里声明,它是函数的一个参数。其值取决于调用函数的方式:
foo(5); // bar will be 5
如果您想询问项的值来自何处,那么答案将来自数据库,toArray()方法类似于我在Q2中描述的方法。它接受回调并使用正确的值调用它。Q1:我们为什么要传递“集合”?我们在哪里申报“收藏”?
集合是在此行上创建的db对象的属性(方法):
db = new Db('winedb', server);
检查mongodb api以了解如何使用它
Q2:为什么我们需要将函数作为参数传递?“集合”在哪里声明?
数据库查询非常慢。程序在继续执行之前等待查询结果是没有意义的,因此查询与其他代码并行进行。您可能会看到这样的问题:如果执行在该点上分叉,如何获得查询结果?答案是回调
您需要将一个函数传递给collection方法,当结果就绪时它将调用该方法。结果将作为参数传递给函数。收集方法的一个非常简单的实现是:
function collection(name, callback) {
var result = // do stuff to get the result;
callback(result);
}
很明显,事情远不止这些,但这是主要思想
因此,概括一下:为了接收结果,您需要将函数作为参数传递。函数中的collection参数将由db.collection方法填充查询结果(如果没有错误)
Q3:为什么我们不必在任何地方申报“物品”?
这个问题暴露出对功能的理解不足
这是一个函数声明:
function foo(bar) {}
bar就在这里声明,它是函数的一个参数。其值取决于调用函数的方式:
foo(5); // bar will be 5
如果你想问物品的价值从何而来