Использование модуля экспорта в узле - PullRequest
1 голос
/ 10 января 2020

Я создаю небольшой проект в узле, у меня есть маршруты из двух таблиц, drums и pianos в одном файле с именами маршрутов. js в двух разных функциях, называемых drums() для барабанов и pianos() для рояли. Я экспортировал обе функции, и они оба возвращают маршрутизатор. Маршрутизатор возвращает значение класса express.Route().

Я использовал эти две функции в индексе. js файл при импорте, я получаю доступ к маршруту по следующему коду

app.use('/pianos', routes.pianos());
app.use('/drums', routes.drums());

Но я получаю ответ только от одной функции, если я сначала сохраните

app.use('/pianos', routes.pianos());

, затем я получу список фортепиано с URL localhost / pianos и localhost / барабаны, а если я сначала сохраню

app.use('/drums', routes.drums());

, то я получу список барабанов с URL localhost / барабаны и localhost / фортепиано, а также. В чем здесь ошибка?

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;

МОЙ индекс. 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}`));

Если есть другие лучшие решения для управления всеми моими маршрутами, пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 10 января 2020

при условии, что мы должны разделить проблемы, я бы порекомендовал разбить все на файлы, в будущем проще поддерживать и добавлять функции, поскольку все на своем месте ...

в NodeJs project, в некоторых случаях встречается некоторая перестановка папок, и я хотел бы предложить следующее:

.
├── 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 содержимое точно то же самое, меняются только «барабаны» и «пианино», поэтому мы знаем, что мы читаем из правильного файла ...

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

полный проект (хотя это очень просто) можно найти на GitHub

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...