TypeScript Node.js Express rotalarını ayrı dosyalarda ayırma en iyi uygulamalar
Typescript ile birlikte bir Node projesinde Express kullanırken, express.Router için 'en iyi uygulamalar' ne olurdu?
örnek dizin yapısı
|directory_name
---server.js
|--node_modules
|--routes
---index.ts
|--admin
---admin.ts
|--products
---products.ts
|--authentication
---authentication.ts
yani index.ts içinde tüm alt yönlendiricileri kapsüller ve yönetir
//admin.ts (nested inside of index.ts)
import * as express from "express";
export = (() => {
let router = express.Router();
router.get('/admin', (req, res) => {
res.json({success: true});
});
return router;
})();
//index.ts (master file for express.Router)
import * as express from "express";
//import sub-routers
import * as adminRouter from "./admin/admin";
import * as productRouter from "./products/products";
export = (() => {
let router = express.Router();
// mount express paths, any addition middleware can be added as well.
// ex. router.use('/pathway', middleware_function, sub-router);
router.use('/products', productRouter);
router.use('/admin', adminRouter);
//return for revealing module pattern
return router;
})(); //<--- this is where I don't understand something....
son olarak server.js'imizi kuracağız
//the usual node setup
//import * as *** http, body-parser, morgan, mongoose, express <-- psudocode
import * as masterRouter from './routes/index'
var app = express();
//set-up all app.use()
app.use('/api', masterRouter);
http.createServer(app).listen(8080, () => {
console.log('listening on port 8080')
};
Asıl sorum gerçekten şu: index.ts (masterRouter dosyası) ve onun iç içe geçmiş rotaları IIFE'ler mi?
export=(function(){})();
router'lar için TypeScript modüllerini yazmanın doğru/en iyi yolu bu olmalı mı?
veya başka bir deseni kullanmak daha mı iyi olur, belki deseni kullanan birini
export function fnName() {} -- export class cName {} -- export default.
IIFE'nin nedeni, onları başka bir dosyaya aktardığımda modülü başlatmam gerekmemesi ve her tür yönlendiricinin yalnızca bir örneği olacağıdır.
Cevap #1
NodeJS'te her dosya bir modüldür. Değişkenler global isim alanını kirletmez. Bu nedenle değişkenleri düzgün bir şekilde kapsamak (ve global kirliliği/çakışmayı önlemek) için eski IIFE numarasını kullanmanıza gerek yoktur.
Şunu yazardınız:
import * as express from "express";
// import sub-routers
import * as adminRouter from "./admin/admin";
import * as productRouter from "./products/products";
let router = express.Router();
// mount express paths, any addition middleware can be added as well.
// ex. router.use('/pathway', middleware_function, sub-router);
router.use('/products', productRouter);
router.use('/admin', adminRouter);
// Export the router
export = router;
Modüller hakkında daha fazla bilgi: https://basarat.gitbooks.io/typescript/content/docs/project/modules.html
