Làm cách nào để tôi đặt một biến trong đó app.js
và làm cho nó có sẵn trong tất cả các tuyến, ít nhất là trong index.js
tệp nằm trong các tuyến. sử dụng khung thể hiện vànode.js
Câu trả lời:
Để tạo một biến toàn cục, chỉ cần khai báo nó mà không cần var
từ khóa. (Nói chung đây không phải là phương pháp hay nhất, nhưng trong một số trường hợp, nó có thể hữu ích - chỉ cần cẩn thận vì nó sẽ làm cho biến có sẵn ở mọi nơi.)
Đây là một ví dụ từ ứng dụng visionmedia / screenshot
tệp app.js :
/**
* Module dependencies.
*/
var express = require('express')
, stylus = require('stylus')
, redis = require('redis')
, http = require('http');
app = express();
//... require() route files
tệp tuyến đường / 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
được liên kết với?
correct
một.
Nó thực sự rất dễ dàng để làm điều này bằng cách sử dụng các phương thức "set" và "get" có sẵn trên một đối tượng express.
Ví dụ như sau, giả sử bạn có một biến được gọi là config với nội dung liên quan đến cấu hình mà bạn muốn có ở những nơi khác:
Trong app.js:
var config = require('./config');
app.configure(function() {
...
app.set('config', config);
...
}
Trong các tuyến đường / index.js
exports.index = function(req, res){
var config = req.app.get('config');
// config is now available
...
}
req.app.get('name')
hoạt động như một sự quyến rũ. Thuộc tính này giữ một tham chiếu đến phiên bản của ứng dụng Express đang sử dụng phần mềm trung gian. expressjs.com/pt-br/api.html#req.app
Một cách đơn giản để làm điều này là sử dụng app.locals
do Express cung cấp.
Đây là tài liệu.
// 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;
}
Để khai báo một biến toàn cục, bạn cần sử dụng đối tượng toàn cục . Giống như global.yourVariableName. Nhưng nó không phải là một cách đúng. Để chia sẻ các biến giữa các mô-đun, hãy thử sử dụng kiểu tiêm như
someModule.js:
module.exports = function(injectedVariable) {
return {
somePublicMethod: function() {
},
anotherPublicMethod: function() {
},
};
};
app.js
var someModule = require('./someModule')(someSharedVariable);
Hoặc bạn có thể sử dụng đối tượng thay thế để làm điều đó. Giống như trung tâm .
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');
Đây là giải thích ngắn gọn:
http://www.hacksparrow.com/global-variables-in-node-js.html
Vì vậy, bạn đang làm việc với một tập hợp các mô-đun Node, có thể là một khuôn khổ như Express.js, và đột nhiên cảm thấy cần phải tạo một số biến toàn cục. Làm cách nào để bạn tạo biến toàn cục trong Node.js?
Lời khuyên phổ biến nhất cho vấn đề này là "khai báo biến mà không có từ khóa var" hoặc "thêm biến vào đối tượng toàn cục" hoặc "thêm biến vào đối tượng GLOBAL". Bạn sử dụng cái nào?
Trước hết, hãy phân tích đối tượng toàn cục. Mở một thiết bị đầu cuối, bắt đầu Node REPL (dấu nhắc).
> 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'
cách dễ nhất là khai báo một biến toàn cục trong app.js của bạn, ngay từ đầu:
global.mySpecialVariable = "something"
sau đó trong bất kỳ tuyến đường nào bạn có thể nhận được nó:
console.log(mySpecialVariable)
Đây là một câu hỏi hữu ích, nhưng có thể hơn thế bằng cách đưa ra các ví dụ mã thực tế. Ngay cả bài viết được liên kết không thực sự hiển thị một triển khai. Do đó, tôi khiêm tốn phục tùng:
Trong app.js
tệp của bạn , đầu tệp:
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 sẽ không có bất kỳ tham chiếu nào đến app.get()
phương thức. Để chúng được xác định trong các tệp tuyến đường riêng lẻ.
routes/index.js
:
require('./main');
require('./users');
và cuối cùng, một tuyến đường tập tin thực tế, 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
Cách ưa thích của tôi là sử dụng các phụ thuộc vòng tròn *, nút nào hỗ trợ
var app = module.exports = express();
là đơn hàng kinh doanh đầu tiên của bạnvar app = require('./app')
truy cậpvar 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');
Như những người khác đã chia sẻ, app.set('config', config)
thật tuyệt vời cho điều này. Tôi chỉ muốn thêm một cái gì đó mà tôi không thấy trong các câu trả lời hiện có khá quan trọng. Một cá thể Node.js được chia sẻ trên tất cả các yêu cầu, vì vậy mặc dù có thể rất thực tế khi chia sẻ một số config
hoặc router
đối tượng trên toàn cầu, nhưng việc lưu trữ dữ liệu thời gian chạy trên toàn cầu sẽ có sẵn trên các yêu cầu và người dùng . Hãy xem xét ví dụ rất đơn giản này:
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);
Nếu bạn truy cập /bar
và một yêu cầu khác xuất hiện /foo
, thông báo của bạn sẽ là "Chào mừng bạn đến với foo!". Đây là một ví dụ ngớ ngẩn, nhưng nó sẽ giải quyết được vấn đề.
Có một số điểm thú vị về điều này tại Tại sao các phiên node.js khác nhau chia sẻ các biến? .
Tôi đã giải quyết vấn đề tương tự, nhưng tôi phải viết nhiều mã hơn. Tôi đã tạo một server.js
tệp, sử dụng express để đăng ký các tuyến đường. Nó cho thấy một chức năng, register
có thể được sử dụng bởi các mô-đun khác để đăng ký các tuyến đường riêng của chúng. Nó cũng cho thấy một chức năng startServer
, để bắt đầu lắng nghe một cổng
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
}
Trong một mô-đun khác, sử dụng tệp này để tạo một tuyến đường.
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
}
Trong tệp chính, khởi động cả hai.
app.js
require('./server').startServer(7000)
require('./web/help').registerHelp()
Câu trả lời của John Gordon là câu trả lời đầu tiên trong số hàng chục câu trả lời được giải thích một nửa / được ghi lại bằng tài liệu mà tôi đã thử, từ rất nhiều trang web, thực sự có hiệu quả. Cảm ơn ông Gordon. Xin lỗi, tôi không có điểm để đánh dấu vào câu trả lời của bạn.
Tôi muốn nói thêm, đối với những người mới khác với node-route-file-splitting, rằng việc sử dụng hàm ẩn danh cho 'index' là điều mà người ta sẽ thấy thường xuyên hơn, vì vậy sử dụng ví dụ của John cho main.js, về mặt chức năng- mã tương đương mà người ta thường tìm thấy là:
app.get('/',(req, res) {
res.render('index', { title: 'Express' });
});
Tôi đã sử dụng app.all
Phương thức app.all () hữu ích để ánh xạ logic "toàn cục" cho các tiền tố đường dẫn cụ thể hoặc các kết quả phù hợp tùy ý.
Trong trường hợp của tôi, tôi đang sử dụng confit để quản lý cấu hình,
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();
});
});
Trong các tuyến đường, bạn chỉ cần làm req.app.get('config').get('cookie');
đây là một điều khá dễ dàng, nhưng câu trả lời của mọi người đồng thời khó hiểu và phức tạp.
hãy để tôi chỉ cho bạn cách bạn có thể đặt biến toàn cục trong express
ứng dụng của mình . Vì vậy, bạn có thể truy cập nó từ bất kỳ tuyến đường nào nếu cần.
Giả sử bạn muốn đặt một biến toàn cục từ /
tuyến đường chính của mình
router.get('/', (req, res, next) => {
req.app.locals.somethingNew = "Hi setting new global var";
});
Vì vậy, bạn sẽ nhận được req.app từ tất cả các tuyến đường. và sau đó bạn sẽ phải sử dụng locals
để thiết lập dữ liệu toàn cầu. như trên cho thấy bạn đã sẵn sàng. bây giờ
tôi sẽ chỉ cho bạn cách sử dụng dữ liệu đó
router.get('/register', (req, res, next) => {
console.log(req.app.locals.somethingNew);
});
Giống như trên từ register
tuyến đường bạn đang truy cập dữ liệu đã được thiết lập trước đó.
Đây là cách bạn có thể làm cho thứ này hoạt động!
req.app.locals
.