使用 Express 將單個實體參考(如記錄器和/或資料庫)傳遞給路由,我目前看到三個選項。
首先是通過中間件將其附加到請求物件:
app.use(function(req,res,next){
req.db = db; //this db comes from app.js context where you define it
next();
});
或在應用程式中為:
app.set('db', db) // db was previously set
...
app.get('user/:id', users.getUser);
然后在你的路由函式呼叫中使用:
module.export.getUser = (req,res) {
...
req.app.get('db').user.find(request.params.id)
下一個方法是在控制器上呼叫一些 init 方法,即:
const users = require('user.js);
... //setup logger, setup db, then call:
users.init(logger,db); // init method sets local logger/database inside user.js
最后是上面的一個變體,它在需要模塊時強制 init 發生一次:
// setup db and logger, then later call:
require('user.js')(db, logger) //not great style-wise by not having all requires near the top of doc
在你的 user.js 中,像這樣設定你的匯出:
module.exports = (db, logger) => { // returning public functions
這就是我真正討厭 vanilla JS 的地方,甚至是像 Express 這樣的框架。這是像 React 這樣的框架如此受歡迎的部分原因,因為有固定的做事方式或至少是普遍接受的模式。
好了,回到正題。將記錄器和資料庫等單實體事物傳遞給所有路由/控制器的最佳實踐是什么?以上之一或更好的東西?
不幸的是,如果您搜索“路由器的最佳實踐”,您將獲得數十種變體。是否有一些轉到參考/圣經?一些最佳實踐或最佳模式指南?
感謝您的任何建議/反饋,保羅
uj5u.com熱心網友回復:
我很困惑你為什么要通過路由框架執行依賴注入。我一直認為它們是兩個完全獨立的層,表達處理 http 請求,然后委托給下面的邏輯。該邏輯可以是 DI 模塊的 IOC 容器或您想要的任何內容。在 JS 中,您可以創建需要依賴項的類,然后創建匯出這些依賴項的實作的模塊。這些模塊將是這些依賴項的單一實作,讓您可以啟動任何您想要的組合。是的,我認為 express 不應該了解您的架構或依賴項,它應該只是將路由映射到服務層功能。
uj5u.com熱心網友回復:
索引.js
const express = require('express');
const app = express();
require('./startup/logging')(app);
require('./startup/routes')(app);
require('./startup/db')();
const config = require('./startup/config');
const server = app.listen(config.app.port, () => console.log(`Listening on port ${config.app.port}...`));
module.exports = server;
啟動/logging.js
const morgan = require('morgan');
module.exports = function (app) {
app.use(morgan('tiny'));
}
啟動/資料庫
const mongoose = require('mongoose');
const config = require('./config');
module.exports = function () {
mongoose.connect(config.db.uri, config.db.parameters)
.then(() => console.log(`Connected to ${config.db.uri}...`));
}
啟動/config.js
require('dotenv').config();
const env = process.env.NODE_ENV || 'dev';
const config = {
'dev': {
app: {
port: parseInt(process.env.DEV_APP_PORT),
},
db: {
uri: process.env.DEV_APP_DB,
parameters: { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true }
},
},
'test': {
app: {
port: parseInt(process.env.TEST_APP_PORT),
},
db: {
uri: process.env.TEST_APP_DB,
parameters: { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true }
},
},
'prod': {
app: {
port: parseInt(process.env.PROD_APP_PORT),
},
db: {
uri: process.env.PROD_APP_DB,
parameters: { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true }
},
}
}
module.exports = config[env];
啟動/routes.js
const express = require('express');
const users = require('user.js);
module.exports = function (app) {
app.use('/api/users', users);
}
路線/用戶.js
const auth = require('../middleware/auth');
const express = require('express');
const router = express.Router();
router.get('/users', auth, async (req, res) => {
res.send([{name: 'paul', name: 'john'}]);
});
module.exports = router;
中間件/認證
require('dotenv').config();
const jwt = require('jsonwebtoken');
module.exports = function (req, res, next) {
const token = req.header('x-auth-token');
if (!token) return res.status(401).send('Access denied. No token provided.');
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded;
next();
}
catch (ex) {
res.status(400).send('Invalid token.');
}
}
.dotenv
NODE_ENV = 'dev'
DEV_APP_PORT = 5000
TEST_APP_PORT = 4000
PROD_APP_PORT = 3000
DEV_APP_DB = 'mongodb://localhost:27017/example_dev'
TEST_APP_DB = 'mongodb://localhost:27017/example_test'
PROD_APP_DB = 'mongodb://localhost:27017/example'
JWT_SECRET = 'yourJwtSecretKey'
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/323863.html
標籤:javascript 节点.js 表达 设计模式 路线
