มีหลักการทั่วไปสำหรับการแบ่งและแยกapp.js
ไฟล์ในแอปพลิเคชันExpress.jsหรือไม่ หรือเป็นเรื่องปกติที่จะเก็บทุกอย่างไว้ในไฟล์เดียว?
มีหลักการทั่วไปสำหรับการแบ่งและแยกapp.js
ไฟล์ในแอปพลิเคชันExpress.jsหรือไม่ หรือเป็นเรื่องปกติที่จะเก็บทุกอย่างไว้ในไฟล์เดียว?
คำตอบ:
ฉันได้ทำลายของฉันดังนี้:
~/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
ฉันใช้การส่งออกเพื่อส่งคืนสิ่งที่เกี่ยวข้อง ตัวอย่างเช่นในโมเดลที่ฉันทำ:
module.exports = mongoose.model('PhoneNumber', PhoneNumberSchema);
จากนั้นถ้าฉันต้องการสร้างหมายเลขโทรศัพท์ก็ทำได้ง่ายๆดังนี้:
var PhoneNumber = require('../models/phoneNumber');
var phoneNumber = new PhoneNumber();
ถ้าฉันจำเป็นต้องใช้สคีมา PhoneNumber.schema
(ซึ่งสมมติว่าเรากำลังทำงานจากโฟลเดอร์เส้นทางและต้องขึ้น 1 ระดับแล้วลงไปที่โมเดล)
วิกิพีเดียด่วนมีรายชื่อของกรอบขึ้นด้านบนของมัน
ในจำนวนนั้นฉันคิดว่ามาธาดอร์ของ Twitter มีโครงสร้างที่ค่อนข้างดี เราใช้วิธีการที่คล้ายกันมากในการโหลดบางส่วนของแอป
derby.jsก็ดูน่าสนใจมากเช่นกัน มันคล้ายกับดาวตกที่ไม่มีโฆษณาทั้งหมดและให้เครดิตจริง ๆ เมื่อถึงกำหนดเครดิต (โดยเฉพาะโหนดและด่วน)
หากคุณเป็นแฟนของ CoffeeScript (ฉันไม่ใช่) และต้องการ L&F ของ Rails จริงๆก็มีTower.jsเช่นกัน
หากคุณมีความคุ้นเคยกับทางรถไฟและไม่ทราบเลือดออกมากกว่าแนวคิดบางอย่างมีหัวรถจักร เป็นเฟรมเวิร์กน้ำหนักเบาที่สร้างขึ้นบน Express มีโครงสร้างที่คล้ายกันมากกับ RoR และมีแนวคิดพื้นฐานบางอย่าง (เช่นการกำหนดเส้นทาง)
ควรตรวจสอบแม้ว่าคุณจะไม่ได้วางแผนที่จะใช้ก็ตาม
nodejs-express-mongoose-demoนั้นคล้ายกับโครงสร้างของฉันมาก ลองดูสิ
คำเตือน:การอ้างอิงโค้ดที่ฉันแฮ็กเข้าด้วยกันสำหรับโหนดที่น่าพิศวงมันใช้งานได้ดี แต่ยังห่างไกลจากความหรูหราหรือสวยงาม
เพื่อให้เจาะจงมากขึ้นเกี่ยวกับการแยกapp.js
ฉันมีไฟล์app.jsต่อไปนี้
var express = require('express'),
bootstrap = require('./init/bootstrap.js'),
app = module.exports = express.createServer();
bootstrap(app);
โดยทั่วไปหมายความว่าฉันวาง bootstrapping ทั้งหมดไว้ในไฟล์แยกจากนั้นฉันบูตเซิร์ฟเวอร์
ดังนั้นสิ่งที่จะบูตทำอย่างไร
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");
};
มันแยกการตั้งค่าเริ่มต้นเซิร์ฟเวอร์ทั้งหมดออกเป็นชิ้น ๆ โดยเฉพาะ
app.configure
)ตัวอย่างเช่นลองดูไฟล์เส้นทาง
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);
ที่นี่ฉันโหลดโมเดลและเส้นทางทั้งหมดเป็นอาร์เรย์ของไฟล์
ข้อจำกัดความรับผิดชอบ: readdirSync
ใช้ได้เฉพาะเมื่อถูกเรียกก่อนที่คุณจะเริ่มเซิร์ฟเวอร์ http (ก่อนหน้า.listen
) การโทรบล็อกการโทรแบบซิงโครนัสในเวลาเริ่มต้นของเซิร์ฟเวอร์ทำให้โค้ดอ่านง่ายขึ้น (โดยพื้นฐานแล้วเป็นการแฮ็ก)
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);
}
});
ที่นี่ฉันเจาะ socket.io เพื่อใช้การอนุญาตจริง ๆ แล้วปล่อยให้ทอมและแจ็คคุยกับเซิร์ฟเวอร์ socket.io ของฉัน
routes.forEach(function(file) {
var route = require(routeUrl + file),
model = require(modelUrl + file);
route(app, model, io);
});
};
ที่นี่ฉันเริ่มเส้นทางของฉันโดยส่งแบบจำลองที่เกี่ยวข้องไปยังวัตถุแต่ละเส้นทางที่ส่งคืนจากไฟล์เส้นทาง
โดยพื้นฐานแล้ว jist คือคุณจัดระเบียบทุกอย่างเป็นโมดูลเล็ก ๆ ที่สวยงามจากนั้นมีกลไกการบูตบางอย่าง
โครงการอื่น ๆ ของฉัน (บล็อกของฉัน) มีไฟล์ init มีโครงสร้างที่คล้ายกัน
ข้อจำกัดความรับผิดชอบ:บล็อกเสียและไม่ได้สร้างฉันกำลังดำเนินการแก้ไข
สำหรับองค์กรการกำหนดเส้นทางการบำรุงรักษาที่คุณสามารถตรวจสอบบทความนี้เกี่ยวกับด่วน routescanโมดูลโหนดและลอง นี่คือทางออกที่ดีที่สุดสำหรับฉัน
ฉันมีแอปของฉันที่สร้างขึ้นจากเครื่องมือสร้างด่วน คุณสามารถติดตั้งได้โดยเรียกใช้ npm install express-generator -g
และเรียกใช้โดยใช้express <APP_NAME>
ไฟล์.
เพื่อให้คุณมีมุมมองหนึ่งในโครงสร้างแอปพลิเคชันขนาดเล็กของฉันมีลักษณะดังนี้:
~/
|~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
สิ่งที่ยอดเยี่ยมอย่างหนึ่งที่ฉันชอบเกี่ยวกับโครงสร้างนี้ฉันนำมาใช้กับแอปพลิเคชันด่วนใด ๆ ที่ฉันพัฒนาคือวิธีการจัดระเบียบเส้นทาง ฉันไม่ชอบที่จะต้องกำหนดเส้นทางไฟล์แต่ละไฟล์ลงใน app.js และapp.use()
แต่ละเส้นทางโดยเฉพาะอย่างยิ่งเมื่อไฟล์มีขนาดใหญ่ขึ้น ด้วยเหตุนี้ฉันจึงพบว่าการจัดกลุ่มและรวมศูนย์ไฟล์app.use()
ไว้ในไฟล์ ./routes/index.js นั้นมีประโยชน์
ในท้ายที่สุด app.js ของฉันจะมีลักษณะดังนี้:
...
const express = require('express');
const app = express();
...
require('./routes/index')(app);
และ. /routes/index.js ของฉันจะมีลักษณะดังนี้:
module.exports = (app) => {
app.use('/users', require('./users'));
app.use('/banks', require('./banks'));
};
ฉันสามารถทำได้เพียงrequire(./users)
เพราะฉันเขียนเส้นทางผู้ใช้โดยใช้ express.Router () ซึ่งทำให้ฉันสามารถ "จัดกลุ่ม" เส้นทางหลาย ๆ เส้นทางแล้วส่งออกพร้อมกันโดยมีเป้าหมายเพื่อทำให้แอปพลิเคชันเป็นแบบแยกส่วนมากขึ้น
นี่คือตัวอย่างของสิ่งที่คุณจะทำได้ดีในเส้นทาง. /routers/users.js ของฉัน:
const router = require('express').Router();
router.post('/signup', async (req, res) => {
// Signup code here
});
module.exports = router;
หวังว่านี่จะช่วยตอบคำถามของคุณได้! ขอให้โชคดี!