我正在 Node 中创建一个小项目,我有两个表的路由,drums
和pianos
在名为routes.js的同一文件中,两个不同的函数分别为鼓的drums()
和钢琴的pianos()
。我已经导出了这两个函数,并且它们都返回路由器。 Router是express.Route()
类的返回值。
我通过导入在index.js文件中使用了这两个函数,我通过以下代码访问路由
app.use('/pianos', routes.pianos());
app.use('/drums', routes.drums());
但是如果我保留,我只能从一个函数得到响应
app.use('/pianos', routes.pianos());
首先,我会得到带有 localhost/pianos 和 localhost/drums url 的钢琴列表,如果我保留的话
app.use('/drums', routes.drums());
首先,我得到了带有 localhost/drums 和 localhost/pianos url 的鼓列表。这里有什么错误吗?
const express = require('express');
const router = express.Router();
const joi = require('joi');
function drums(){
drums = [
{id:1, name:'Bongo drum'},
{id:2, name:'Bass drum'},
{id:3, name:'Ashiko'},
{id:4, name:'Basler drum'},
{id:5, name:'Cajón'}
];
router.get('/', (req, res)=>{
res.send(drums);
});
router.get('/:id', (req, res) =>{
const drum = drums.find( c=> c.id === parseInt(req.params.id));
if(!drum){
return res.status(404).send("Error: Drum is not available");
}
res.send(drum.name);
});
router.post('/', (req, res)=>{
const {error} = validator(req.body);
if(error) return res.status(400).send('Eror 400: Bad request', error.details[0].message);
const drum = {id:drums.length+1, name:req.body.name};
drums.push(drum);
res.send(drum);
}
);
router.put('/:id', (req, res)=>{
const drum = drums.find(c=> c.id === parseInt(req.params.id));
if(!drum) return res.status(404).send('Error: Drum is not available');
const {error} = validator(req.body);
if(error) return res.status(400).send('Error 400: Bad request', error.details[0].message);
drum.name = req.body.name;
res.send(drum);
});
return router;
}
function pianos(){
const pianos = [
{id:1, name:'Yamaha U1'},
{id:2, name:'Roland RD-2000'},
{id:3, name:'Nord Piano 4'},
{id:4, name:'Yamaha NU1X'},
{id:5, name:' Dexibell Vivo S7'}
];
router.get('/', (req, res)=>{
res.send(pianos);
});
router.get('/:id', (req, res)=>{
const piano = pioanos.find(c=> c.id === parseInt(req.params.id));
if(!piano) return res.status(404).send('Error:The piano is not available');
res.send(piano);
});
router.post('/', (req, res)=>{
const {error} = validator(req.body);
if(error) return res.status(400).send('Error-Bad request', error.details[0].message);
const piano = {id:pianos.length+1, name:req.body.name};
pianos.push(piano);
res.send(piano);
});
router.put('/:id', (res, req)=>{
const piano = pioanos.find(c=> c.id === parseInt(req.params.id));
if(!piano) return res.status(404).send('Error: Piano is the available');
const {error} = validator(req.body);
if(error) return res.status(400).send('Error:Bad request', error.details[0].message);
piano.name = req.body.name;
res.send(piano);
});
return router;
}
function validator(instrument){
const schema={
name:joi.string().min(5).required()
};
return joi.validate(instrument, schema);
}
module.exports.drums = drums;
module.exports.pianos = pianos;
我的index.js文件是这样的:
const mongoose = require('mongoose');
const express = require('express');
const app = express();
const debug = require('debug')('pm:index');
const routes = require('./routes/routes');
mongoose.connect('mongodb:localhost/planetmusic')
.then(()=> debug('Connected to database'))
.catch(err => debug('Error!!Could not connect to database', err.message));
app.use(express.json());
app.use(express.urlencoded({extended: true}));
app.use(express.static('public'));
app.use('/drums', routes.drums());
app.use('/pianos', routes.pianos());
const port = process.env.port || 5000;
app.listen(port, ()=> console.log(`listening at port: ${port}`));
如果有其他更好的解决方案来管理我的所有路线,请帮助我。
最佳答案
考虑到我们应该分离关注点,我建议将所有内容拆分为文件,这样更容易维护并在将来添加功能,因为所有内容都在自己的位置......
在 NodeJs 项目中,在示例中遇到一些文件夹重新排列是很正常的,我建议这样做:
.
├── package.json
└── server/
├── server.js
└── routes/
├── drums.js
├── index.js
└── piano.js
这是一个非常简单的示例,因此您可以了解 ExpressJs 路由分布在多个文件上时如何工作:
server.js
内容
const express = require('express');
const routes = require('./routes');
const app = express();
const PORT = 5001;
app.use('/drums', routes.drums);
app.use('/pianos', routes.pianos);
app.use('/', (req, res) => { res.send({ action: 'default get' }); });
app.listen(PORT, () => {
require('./utilities/api-table')(app._router.stack);
console.log(`ready on http://localhost:${PORT}`);
});
server/routes/index.js
内容
const fs = require("fs");
const path = require("path");
const routing = {};
fs.readdirSync(__dirname) // read all files in this directory
.filter(
file =>
// only read .js files, but not the index.js (this file)
file.indexOf(".") !== 0 && file !== "index.js" && file.slice(-3) === ".js"
)
.forEach(file => {
const filename = file.replace(".js", "");
// attach the routes in it's own filename
routing[filename] = require(path.join(__dirname, file));
});
module.exports = routing;
drums.js
和 pianos.js
内容完全相同,只是“drums”和“pianos”发生变化,因此我们知道我们正在从正确的文件中读取...
const express = require('express');
const router = express.Router();
const getAll = (req, res) => {
res.send({ action: 'GET all drums' })
};
const create = (req, res) => {
res.send({ action: 'POST drums', data: res.body })
};
const getById = (req, res) => {
res.send({ action: 'GET drums by id', id: req.params.id })
};
const editById = (req, res) => {
res.send({ action: 'PUT drums by id', id: req.params.id })
};
const deleteById = (req, res) => {
res.send({ action: 'DEL drums by id', id: req.params.id })
};
router.get('/', getAll);
router.post('/', create);
router.get('/:id', getById);
router.put('/:id', editById);
router.delete('/:id', deleteById);
module.exports = router;
当你启动服务器时,你将获得所有这些路由:
并输出为
完整项目(虽然很简单)can be found on GitHub
关于javascript - 在 Node 中使用导出模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59673388/