app.js
Bir Express.js uygulamasında dosyayı parçalamak ve modüler hale getirmek için ortak bir kural var mı ? Yoksa her şeyi tek bir dosyada tutmak yaygın mıdır?
app.js
Bir Express.js uygulamasında dosyayı parçalamak ve modüler hale getirmek için ortak bir kural var mı ? Yoksa her şeyi tek bir dosyada tutmak yaygın mıdır?
Yanıtlar:
Benimkini aşağıdaki gibi ayırdım:
~/app
|~controllers
| |-monkey.js
| |-zoo.js
|~models
| |-monkey.js
| |-zoo.js
|~views
| |~zoos
| |-new.jade
| |-_form.jade
|~test
| |~controllers
| |-zoo.js
| |~models
| |-zoo.js
|-index.js
İlgili olanı iade etmek için Dışa Aktarma'yı kullanıyorum. Örneğin yaptığım modellerde:
module.exports = mongoose.model('PhoneNumber', PhoneNumberSchema);
ve sonra bir telefon numarası oluşturmam gerekirse, bu kadar basit:
var PhoneNumber = require('../models/phoneNumber');
var phoneNumber = new PhoneNumber();
şemayı kullanmam gerekirse, o zaman PhoneNumber.schema
(rotalar klasöründen çalıştığımızı ve 1 seviye yukarı ve sonra modellere gitmemiz gerektiğini varsayar)
Ekspres wiki bunun üstüne inşa çerçeveler bir listesi vardır.
Bunlardan Twitter'ın matadorunun oldukça iyi yapılandırılmış olduğunu düşünüyorum . Aslında uygulamanın bölümlerini nasıl yüklediklerine çok benzer bir yaklaşım kullandık.
derby.js de son derece ilginç görünüyor. Bu, tüm yutturmaca olmadan meteor gibi ve aslında kredinin gerekli olduğu yerde (özellikle düğüm ve ifade) kredi veriyor.
Eğer bir CoffeeScript hayranıysanız (ben değilim) ve reeeeaaaaaally Rails'in L&F'sini istiyorsanız, Tower.js de var .
Rails'e aşinaysanız ve bazı kavramların taşmasına aldırış etmiyorsanız, Lokomotif vardır . Express üzerine kurulu hafif bir çerçevedir. RoR ile çok benzer bir yapıya sahiptir ve daha ilkel kavramlardan bazılarını (yönlendirme gibi) taşır.
Kullanmayı planlamıyor olsanız bile kontrol etmeye değer.
nodejs-express-mongoose-demo benim yapılandırdığıma çok benziyor. Bunu kontrol et.
Uyarı: Node knockout için birlikte hacklediğim kod referansı, bir tür işe yarıyor, ancak zarif veya cilalı olmaktan uzak.
Bölünmesine hakkında daha spesifik olması app.js
ben şu var app.js dosyayı
var express = require('express'),
bootstrap = require('./init/bootstrap.js'),
app = module.exports = express.createServer();
bootstrap(app);
Bu, temelde tüm önyüklememi ayrı bir dosyaya koyduğum ve ardından sunucuyu önyüklediğim anlamına gelir.
Öyleyse bootstrap ne yapar ?
var configure = require("./app-configure.js"),
less = require("./watch-less.js"),
everyauth = require("./config-everyauth.js"),
routes = require("./start-routes.js"),
tools = require("buffertools"),
nko = require("nko"),
sessionStore = new (require("express").session.MemoryStore)()
module.exports = function(app) {
everyauth(app);
configure(app, sessionStore);
less();
routes(app, sessionStore);
nko('/9Ehs3Dwu0bSByCS');
app.listen(process.env.PORT);
console.log("server listening on port xxxx");
};
Tüm sunucu başlatma kurulumunu güzel parçalara böler. Özellikle
app.configure
)Örneğin, yönlendirme dosyasına bakalım
var fs = require("fs"),
parseCookie = require('connect').utils.parseCookie;
module.exports = function(app, sessionStore) {
var modelUrl = __dirname + "/../model/",
models = fs.readdirSync(modelUrl),
routeUrl = __dirname + "/../route/"
routes = fs.readdirSync(routeUrl);
Burada tüm modellerimi ve rotalarımı dosya dizileri olarak yüklüyorum.
Sorumluluk reddi: readdirSync
yalnızca http sunucusunu başlatmadan önce (önce .listen
) çağrıldığında uygundur . Senkronize engelleme çağrılarını sunucunun başlangıç zamanında çağırmak, yalnızca kodu daha okunaklı hale getirir (temelde bir hack'tir)
var io = require("socket.io").listen(app);
io.set("authorization", function(data, accept) {
if (data.headers.cookie) {
data.cookie = parseCookie(data.headers.cookie);
data.sessionId = data.cookie['express.sid'];
sessionStore.get(data.sessionId, function(err, session) {
if (err) {
return accept(err.message, false);
} else if (!(session && session.auth)) {
return accept("not authorized", false)
}
data.session = session;
accept(null, true);
});
} else {
return accept('No cookie', false);
}
});
Burada, herhangi bir tom ve jack'in socket.io sunucumla konuşmasına izin vermek yerine, yetkilendirmeyi kullanmak için socket.io'yu yumrukluyorum.
routes.forEach(function(file) {
var route = require(routeUrl + file),
model = require(modelUrl + file);
route(app, model, io);
});
};
Burada rota dosyasından döndürülen her rota nesnesine ilgili modeli geçirerek rotalarıma başlıyorum.
Temel olarak, her şeyi güzel küçük modüller halinde organize etmeniz ve ardından bazı önyükleme mekanizmalarına sahip olmanızdır.
Diğer projemde (blogum) benzer yapıya sahip bir başlangıç dosyası var .
Sorumluluk reddi beyanı: blog bozuk ve oluşturulmuyor, üzerinde çalışıyorum.
Bakım yapılabilir yönlendirme organizasyonu için express-routecan düğüm modülü hakkındaki bu makaleye göz atabilir ve deneyebilirsiniz. Bu benim için en iyi çözüm.
Uygulamalarımın ekspres jeneratör aracının üzerine inşa edilmesini sağladım. npm install express-generator -g
Çalıştırarak kurabilir ve kullanarak çalıştırabilirsiniz express <APP_NAME>
.
Size bir bakış açısı kazandırmak için, küçük uygulamamın yapısından biri şuna benziyordu:
~/
|~bin
| |-www
|
|~config
| |-config.json
|
|~database
| |-database.js
|
|~middlewares
| |-authentication.js
| |-logger.js
|
|~models
| |-Bank.js
| |-User.js
|
|~routes
| |-index.js
| |-banks.js
| |-users.js
|
|~utilities
| |-fiat-converersion.js
|
|-app.js
|-package.json
|-package-lock.json
Geliştirdiğim herhangi bir hızlı uygulama için benimsediğim bu yapıyla ilgili sevdiğim harika bir şey, rotaların düzenlenme şekli. app.use()
Özellikle dosya büyüdükçe her rota dosyasını app.js'ye ve her rotaya zorunlu kılmaktan hoşlanmadım . Bu nedenle, tüm işimi gruplandırıp merkezileştirmeyi yararlı buldum.app.use()
bir ./routes/index.js dosyasında .
Sonunda, app.js şunun gibi görünecek:
...
const express = require('express');
const app = express();
...
require('./routes/index')(app);
ve ./routes/index.js şunun gibi görünecek:
module.exports = (app) => {
app.use('/users', require('./users'));
app.use('/banks', require('./banks'));
};
Basitçe yapabiliyorum require(./users)
çünkü kullanıcı rotasını express.Router () kullanarak birden fazla rotayı "gruplandırmama" ve uygulamayı daha modüler hale getirmek amacıyla bir kerede dışa aktarmama izin veriyor.
Bu, ./routers/users.js rotamda neyin iyi olacağına dair bir örnektir:
const router = require('express').Router();
router.post('/signup', async (req, res) => {
// Signup code here
});
module.exports = router;
Umarım bu, sorunuzu yanıtlamaya yardımcı olmuştur! İyi şanslar!