Bagaimana cara menetapkan variabel app.js
dan membuatnya tersedia di semua rute, setidaknya di index.js
file yang terletak di rute. menggunakan kerangka kerja ekspres dannode.js
Jawaban:
Untuk membuat variabel global, cukup deklarasikan tanpa var
kata kunci. (Secara umum, ini bukan praktik terbaik, tetapi dalam beberapa kasus dapat berguna - berhati-hatilah karena akan membuat variabel tersedia di mana saja.)
Berikut adalah contoh dari visionmedia / screenshot-app
file app.js :
/**
* Module dependencies.
*/
var express = require('express')
, stylus = require('stylus')
, redis = require('redis')
, http = require('http');
app = express();
//... require() route files
rute file / main.js
//we can now access 'app' without redeclaring it or passing it in...
/*
* GET home page.
*/
app.get('/', function(req, res, next){
res.render('index');
});
//...
app
terkait?
correct
satu.
Sebenarnya sangat mudah untuk melakukan ini dengan menggunakan metode "set" dan "get" yang tersedia pada objek ekspres.
Contoh sebagai berikut, katakanlah Anda memiliki variabel bernama config dengan hal-hal yang terkait dengan konfigurasi yang ingin Anda sediakan di tempat lain:
Di app.js:
var config = require('./config');
app.configure(function() {
...
app.set('config', config);
...
}
Di routes / index.js
exports.index = function(req, res){
var config = req.app.get('config');
// config is now available
...
}
req.app.get('name')
berfungsi seperti pesona. Properti ini menyimpan referensi ke contoh aplikasi Express yang menggunakan middleware. expressjs.com/pt-br/api.html#req.app
Cara yang rapi untuk melakukannya adalah dengan menggunakan yang app.locals
disediakan oleh Express itu sendiri.
Berikut dokumentasinya.
// In app.js:
app.locals.variable_you_need = 42;
// In index.js
exports.route = function(req, res){
var variable_i_needed = req.app.locals.variable_you_need;
}
Untuk mendeklarasikan variabel global, Anda perlu menggunakan objek global . Seperti global.yourVariableName. Tapi itu bukanlah cara yang benar. Untuk berbagi variabel antar modul coba gunakan gaya injeksi seperti
someModule.js:
module.exports = function(injectedVariable) {
return {
somePublicMethod: function() {
},
anotherPublicMethod: function() {
},
};
};
app.js
var someModule = require('./someModule')(someSharedVariable);
Atau Anda dapat menggunakan objek pengganti untuk melakukan itu. Seperti hub .
someModule.js:
var hub = require('hub');
module.somePublicMethod = function() {
// We can use hub.db here
};
module.anotherPublicMethod = function() {
};
app.js
var hub = require('hub');
hub.db = dbConnection;
var someModule = require('./someModule');
Berikut penjelasannya dengan baik, singkatnya:
http://www.hacksparrow.com/global-variables-in-node-js.html
Jadi Anda bekerja dengan satu set modul Node, mungkin kerangka kerja seperti Express.js, dan tiba-tiba merasa perlu untuk membuat beberapa variabel global. Bagaimana Anda membuat variabel global di Node.js?
Saran paling umum untuk yang satu ini adalah "mendeklarasikan variabel tanpa kata kunci var" atau "menambahkan variabel ke objek global" atau "menambahkan variabel ke objek GLOBAL". Yang mana yang Anda gunakan?
Pertama, mari kita analisis objek global. Buka terminal, mulai Node REPL (prompt).
> global.name
undefined
> global.name = 'El Capitan'
> global.name
'El Capitan'
> GLOBAL.name
'El Capitan'
> delete global.name
true
> GLOBAL.name
undefined
> name = 'El Capitan'
'El Capitan'
> global.name
'El Capitan'
> GLOBAL.name
'El Capitan'
> var name = 'Sparrow'
undefined
> global.name
'Sparrow'
cara termudah adalah dengan mendeklarasikan variabel global di app.js Anda, sejak awal:
global.mySpecialVariable = "something"
lalu di rute mana pun Anda bisa mendapatkannya:
console.log(mySpecialVariable)
Ini adalah pertanyaan yang membantu, tetapi bisa lebih dari itu dengan memberikan contoh kode yang sebenarnya. Bahkan artikel terkait tidak benar-benar menunjukkan implementasi. Oleh karena itu, saya dengan rendah hati menyampaikan:
Di app.js
file Anda , bagian atas file:
var express = require('express')
, http = require('http')
, path = require('path');
app = express(); //IMPORTANT! define the global app variable prior to requiring routes!
var routes = require('./routes');
app.js tidak akan memiliki referensi apa pun ke app.get()
metode. Biarkan ini ditentukan di file rute individu.
routes/index.js
:
require('./main');
require('./users');
dan akhirnya, sebuah rute file yang sebenarnya, routes/main.js
:
function index (request, response) {
response.render('index', { title: 'Express' });
}
app.get('/',index); // <-- define the routes here now, thanks to the global app variable
Cara yang saya sukai adalah menggunakan dependensi melingkar *, yang didukung node
var app = module.exports = express();
sebagai urutan pertama bisnis Andavar app = require('./app')
mengaksesnyavar express = require('express');
var app = module.exports = express(); //now app.js can be required to bring app into any file
//some app/middleware, config, setup, etc, including app.use(app.router)
require('./routes'); //module.exports must be defined before this line
var app = require('./app');
app.get('/', function(req, res, next) {
res.render('index');
});
//require in some other route files...each of which requires app independently
require('./user');
require('./blog');
Seperti yang telah dibagikan orang lain, app.set('config', config)
bagus untuk ini. Saya hanya ingin menambahkan sesuatu yang tidak saya lihat dalam jawaban yang ada yang cukup penting. Instance Node.js dibagikan ke semua permintaan, jadi meskipun mungkin sangat praktis untuk membagikan beberapa config
atau router
objek secara global, menyimpan data runtime secara global akan tersedia di seluruh permintaan dan pengguna . Pertimbangkan contoh yang sangat sederhana ini:
var express = require('express');
var app = express();
app.get('/foo', function(req, res) {
app.set('message', "Welcome to foo!");
res.send(app.get('message'));
});
app.get('/bar', function(req, res) {
app.set('message', "Welcome to bar!");
// some long running async function
var foo = function() {
res.send(app.get('message'));
};
setTimeout(foo, 1000);
});
app.listen(3000);
Jika Anda mengunjungi /bar
dan permintaan lain mencapai /foo
, pesan Anda akan menjadi "Selamat datang di foo!". Ini adalah contoh yang konyol, tetapi maksudnya jelas.
Ada beberapa poin menarik tentang ini di Mengapa sesi node.js yang berbeda berbagi variabel? .
Saya memecahkan masalah yang sama, tetapi saya harus menulis lebih banyak kode. Saya membuat server.js
file, yang menggunakan express untuk mendaftarkan rute. Ini memperlihatkan sebuah fungsi,, register
yang dapat digunakan oleh modul lain untuk mendaftarkan rute mereka sendiri. Ini juga mengekspos fungsi startServer
,, untuk mulai mendengarkan sebuah port
server.js
const express = require('express');
const app = express();
const register = (path,method,callback) => methodCalled(path, method, callback)
const methodCalled = (path, method, cb) => {
switch (method) {
case 'get':
app.get(path, (req, res) => cb(req, res))
break;
...
...
default:
console.log("there has been an error");
}
}
const startServer = (port) => app.listen(port, () => {console.log(`successfully started at ${port}`)})
module.exports = {
register,
startServer
}
Di modul lain, gunakan file ini untuk membuat rute.
help.js
const app = require('../server');
const registerHelp = () => {
app.register('/help','get',(req, res) => {
res.send("This is the help section")
}),
app.register('/help','post',(req, res) => {
res.send("This is the help section")
})}
module.exports = {
registerHelp
}
Di file utama, bootstrap keduanya.
app.js
require('./server').startServer(7000)
require('./web/help').registerHelp()
ini adalah hal yang cukup mudah, tetapi jawaban orang-orang membingungkan dan rumit pada saat yang bersamaan.
izinkan saya menunjukkan kepada Anda bagaimana Anda dapat mengatur variabel global di express
aplikasi Anda . Jadi Anda dapat mengaksesnya dari rute mana pun sesuai kebutuhan.
Katakanlah Anda ingin menyetel variabel global dari /
rute utama Anda
router.get('/', (req, res, next) => {
req.app.locals.somethingNew = "Hi setting new global var";
});
Jadi Anda akan mendapatkan req.app dari semua rute. dan kemudian Anda harus menggunakan locals
untuk menyetel data global. seperti di atas menunjukkan Anda sudah siap. sekarang
saya akan menunjukkan cara menggunakan data itu
router.get('/register', (req, res, next) => {
console.log(req.app.locals.somethingNew);
});
Seperti di atas dari register
rute Anda mengakses data yang telah diatur sebelumnya.
Ini adalah bagaimana Anda bisa membuat benda ini bekerja!
Jawaban John Gordon adalah yang pertama dari lusinan jawaban setengah dijelaskan / terdokumentasi yang saya coba, dari banyak, banyak situs, yang benar-benar berfungsi. Terima kasih, Tuan Gordon. Maaf, saya tidak punya poin untuk menandai jawaban Anda.
Saya ingin menambahkan, untuk pemula lainnya untuk node-route-file-splitting, bahwa penggunaan fungsi anonim untuk 'index' adalah yang akan lebih sering dilihat, jadi dengan menggunakan contoh John untuk main.js, fungsi- kode yang setara yang biasanya ditemukan adalah:
app.get('/',(req, res) {
res.render('index', { title: 'Express' });
});
Saya menggunakan app.all
Metode app.all () berguna untuk memetakan logika "global" untuk prefiks jalur tertentu atau kecocokan arbitrer.
Dalam kasus saya, saya menggunakan confit untuk manajemen konfigurasi,
app.all('*', function (req, res, next) {
confit(basedir).create(function (err, config) {
if (err) {
throw new Error('Failed to load configuration ', err);
}
app.set('config', config);
next();
});
});
Di rute, Anda cukup melakukannya req.app.get('config').get('cookie');
req.app.locals
.