Bir express.js uygulaması nasıl yapılandırılır?


102

app.jsBir 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?


3
Onları rotalara ayıran insanlar oldu. Ayrıca ekspres kaynaklara da göz atabilirsiniz.
BRampersad

@Brandon_R Kaynakları denediniz mi? Ona baktım ve düzgün göründüğünü düşündüm, sadece lastikleri henüz tekmelemedim.
Chance

1
Biraz geç kaldım, ancak yakın zamanda ekspres için bir yönlendirici açtım, bu da app.js'yi güzel bir şekilde giriş denetleyicileri + görünümler vb. Parçalamanıza izin veriyor. Bakınız: github.com/kishorenc/road
jeffreyveon

Yanıtlar:


82

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)


DÜZENLE 4

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.


DÜZENLEME 3

Eğer bir CoffeeScript hayranıysanız (ben değilim) ve reeeeaaaaaally Rails'in L&F'sini istiyorsanız, Tower.js de var .


DÜZENLEME 2

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.


DÜZENLE 1

nodejs-express-mongoose-demo benim yapılandırdığıma çok benziyor. Bunu kontrol et.


2
İş mantığı nereye gidiyor? Kimlik doğrulama gibi şeyler için hiç yardımcıları kullandınız mı?
Eric the Red

@ErictheRed MVC Modeline (raylar, Asp.Net mvc, vb.) Aşina iseniz, Rotalarımı denetleyicilerim olarak kabul ediyorum ve bundan sonra her şey yerine oturuyor. İş mantığı modellere giriyor (doğrulama ve firavun faresi ile ilgili zorluklar yaşıyor olsam da). Yardımcılar için, yeniden kullandığım şeyler için kendim için bir araya getirdiğim basit bir dahili kullanım kitaplığında Dışa Aktarma'yı kullanıyorum.
Şans

Bakmamız için github'a örnek bir kurulum yüklemek harika olurdu. Routes klasörüne / dosyalarına neler girer?
chovy

1
@chovy Github.com/qed42/nodejs-express-mongoose-demo'ya çok benzer bir yapıya sahip bir bağlantı ekledim
Chance


9

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.jsben ş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

  • Everyauth kullanarak tüm uzak OAuth kimlik doğrulamamı ayarlayan bir parçam var.
  • Uygulamamı yapılandıran bir parçam var (temelde arama app.configure)
  • Daha az yumruk atan biraz kodum var, böylece daha azımdan herhangi birini çalışma zamanında css'de yeniden derler.
  • Tüm rotalarımı belirleyen kodum var
  • Bu küçük nko modülüne diyorum
  • Sonunda bir portu dinleyerek sunucuyu başlatıyorum.

Ö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.



0

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!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.