javascript - 在 Node 中使用导出模块

标签 javascript node.js node-modules

我正在 Node 中创建一个小项目,我有两个表的路由,drumspianos在名为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.jspianos.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;

当你启动服务器时,你将获得所有这些路由:

enter image description here

并输出为

enter image description here

完整项目(虽然很简单)can be found on GitHub

关于javascript - 在 Node 中使用导出模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59673388/

相关文章:

javascript - Roundcube java脚本 `beforelogin`事件 Hook

Node.js:我应该在生产代码中保留 `assert()` 吗?

javascript - 不完整的 Node HTTP.Response

node-modules - 如何在 vue-cli 3 应用程序之间共享节点模块?

javascript - jquery克隆表单单个字段并增加id

javascript - 如何完成清洁横幅

javascript - 是否可以从另一个包导入 Node 包?

javascript - node.js:从另一个模块访问局部变量

javascript - 如何使用JS仅在字符串中间按空格拆分字符串

asp.net - Azure 构建中的 Node.js 错误