gpt4 book ai didi

node.js - 重构NodeJS项目的中间件代码,使用路由、 Controller 和模型

转载 作者:行者123 更新时间:2023-12-04 10:03:14 24 4
gpt4 key购买 nike

我目前难以构建我的 NodeJS 项目。我关注了几个 YouTube 系列,看到人们使用不同的技术来构建他们的代码。在我的情况下,您会建议我使用哪种结构?什么是最佳实践?

我有我的 app.js其中包含建立到 MongoDB 的连接,初始化 express、bodyParser、pug 作为 View 引擎,最后启动服务器。

我的 router.js包含所有路由,不幸的是一些中间件代码,我想将它们移到他们自己的专用 Controller 中。
models文件夹包含 MongoDB 的所有架构文件。

// File structure:
.
├─ controllers
| ├─ morticians.js
| ├─ people.js
| └─ pickups.js
├─ models
| ├─ mortician.js
| ├─ person.js
| └─ pickup.js
├─ views
| ├─ elements
| | └─ ..
| ├─ pages
| | ├─ dashboard.pug
| | └─ ..
| └─ layout.pug
├─ app.js
└─ router.js

我们是一家医院,有时人们会死在这里。殡仪馆来接他们,但从我们的系统中删除此人的过程尚未自动化。这就是这个 webapp 的用途。从我们的数据库中提取所有死者,将他们显示在 web 应用程序中,并在殡仪馆人员来接那个人时立即将其删除。

1. 当主页面被请求时,它会找到所有人,然后是来自 MongoDB 的所有殡仪馆,最后呈现页面。我可以想象,这不是最佳实践,但如何重构它?
// snippet router.js
const Person= require('./models/person')
const Mortician = require('./models/mortician')
router.get('/', (req, res, next) => {
Person.find({ pickedUp: false }, (err, people) => {
Mortician.find({}, (err, morticians) => {
if (err) return console.log(err);
res.render('pages/dashboard', {
title: 'Dashboard',
persons: people,
morticians: morticians
})
})
})
}

我尝试将 MongoDB 操作移到他们的 controller 中。文件,像这样。它奏效了,但我不确定,因为它使用了多个 Promise 并且并没有真正简化事情:
// snippet router.js
const ConPeople = require('./controllers/people')
const ConMorticians = require('./controllers/morticians')
router.get('/',
(req, res, next) => {
res.locals.options = { pickedUp: false }
ConPeople.find(req, res, next)
.then((people) => {
res.locals.people = people
next()
})
},
(req, res, next) => {
res.locals.options = {}
ConMorticians.find(req, res, next)
.then((morticians) => {
res.locals.morticians = morticians
next()
})
},
(req, res) => {
res.render('pages/dashboard', {
title: 'Dashboard',
people: res.locals.people,
morticians: res.locals.morticians.reverse()
})
}
)

// snippet controllers/people.js
module.exports = {
find: (req, res, next) => {
return Person.find(res.locals.options)
}
}

2. 在某些情况下,我需要执行诸如从 MongoDB 删除或添加人员之类的命令。例如,殡仪馆来接人。我需要将那个人的状态设置为 pickedUp = true , 最终添加一个新的殡葬师(如果提供)并向集合中添加一个新文档 pickups .如何在不必重写相同行的情况下做到这一点?

最佳答案

有两件事,当结合使用时,会使代码更好:

  • Collection.find返回一个 Promise。
  • 要等待 Promise 在现代 Javascript 中解析,请使用 await

  • 您可以使用以下代码:
    const Person= require('./models/person')
    const Mortician = require('./models/mortician')
    router.get('/', async (req, res, next) => {
    try {
    const persons = await Person.find({ pickedUp: false });
    const morticians = await Mortician.find({});
    res.render('pages/dashboard', {
    title: 'Dashboard',
    persons,
    morticians,
    });
    } catch(e) {
    // handle errors
    }
    });

    或者,要并行而不是串行检索结果,请使用 Promise.all :
    router.get('/', async (req, res, next) => {
    try {
    const [persons, morticians] = await Promise.all([
    Person.find({ pickedUp: false }),
    Mortician.find({})
    ]);
    res.render('pages/dashboard', {
    title: 'Dashboard',
    persons,
    morticians,
    });
    } catch(e) {
    // handle errors
    }
    });

    只要您有多个异步调用,您就可以使用相同类型的模式 - 不需要丑陋的括号嵌套和缩进。

    关于node.js - 重构NodeJS项目的中间件代码,使用路由、 Controller 和模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61726347/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com