2016-05-30 1 views
2

以下は、mlabでホストされているデータベースに接続する機能的なアプリケーションです。しかし、MongoClient.connectへのコールバックで定義された "db"変数が、コードの他の場所でどのようにアクセス可能であるかについて、私は混乱しています。私が見ていない接続機能の中で起こっている魔法がありますか? FYI私の変数は、自分のコードのどこか他の場所でアクセス可能なコールバックで定義されていますか?

const express = require('express'); 
const bodyParser = require('body-parser'); 
const MongoClient = require('mongodb').MongoClient 
const app = express(); 

app.use(bodyParser.urlencoded({extended: true})); 

MongoClient.connect('link-to-my-db', (err, database) => { 
    if (err) return console.log(err); 
    db = database; 
    app.listen(3000,() => { 
    console.log("Listening on 3000"); 
    }); 
}); 

app.get('/', (req, res) => { 
    res.sendFile(__dirname + '/index.html'); 
}); 

app.post('/quotes', (req, res) => { 
    // How is it possible for "db" to be accessible here even though it was defined in a separate function? 
    db.collection('quotes').save(req.body, (err, result) => { 
    if (err) return console.log(err); 

    console.log('saved to database'); 
    res.redirect('/'); 

    }) 
}); 

::私は、ノード上の入門チュートリアル次られた以下のコメントを参照してください。私は魔法のように上記のコードを書いていませんでした! http://www.w3schools.com/js/js_scope.aspを引用

答えて

4

:あなたが宣言されていない変数に値を割り当てた場合、それは自動的にグローバル変数になります

db変数は、その前にvarキーワードを持っていないので、

このことは、それが暗黙のうちにグローバル変数として宣言し、あなたのアプリケーションの残りの部分からアクセス可能です。

+1

はまた、[Strictモード](HTTPSを使用する場合、グローバル変数の暗黙の宣言が許可されないことに注意してください.mozilla.org/ja/docs/Web/JavaScript/Reference/Strict_mode)。 –

0

あなたはVAR /聞かせて/、const宣言を使用しない場合は、これは何が起こるかです://開発者:

var db; // declaration from below hoisted to global scope 

MongoClient.connect('link-to-my-db', (err, database) => { 
    if (err) return console.log(err); 
    db = database;       // the hoisted declaration, is set here 
    app.listen(3000,() => { 
    console.log("Listening on 3000"); 
    }); 
}); 
関連する問題