Как вызвать 2 разных модуля с разным URL. сервер продолжает отправлять результаты первых модулей для второго запроса

#javascript #node.js

#javascript #node.js

Вопрос:

Я новичок в NodeJS. Я пытаюсь вызвать 2 разных модуля с отдельными запросами URL, но сервер продолжает отправлять массив JSON первого модуля, как я могу решить эту проблему.

вот app.js код

 const express = require('express');
const bearModeule = require('./bear');
const batModule = require('./bat');

const app = express();
app.use(express.json());

app.use('/',bearModeule);
app.use('/bat',batModule);


const PORT = 3000;
app.listen(PORT, () => {
    console.log(`Listing on port ${PORT}`);
});
  

Перенос кода модуля

 let bear = function(req,res,next){

    let bearArray = [
        {id:1, name:"polar bear"},
        {id:2, name:"grizzly bear"},
        {id:3, name:"panda bear"}
    ]

    res.send(bearArray);
    next();
}

module.exports = bear;
  

Код модуля Bat

 let bat = function(req,res,next){

    let batArray = [
        {id:1, name:"black bat"},
        {id:2, name:"brown bat"}
    ]

    res.send(batArray);
    next();
}

module.exports = bat;
  

Ответ №1:

просто в app.js напишите следующий код.

 const express = require('express');
const bearModeule = require('./bear');
const batModule = require('./bat');
const router = express.Router(); 
const app = express();

app.use('/', router);

app.get('/bear', bearModeule);
app.get('/bat', batModule);

const PORT = 3000;
app.listen(PORT, () => {
   console.log(`Listing on port ${PORT}`);
});
  

Ответ №2:

app.use() указать промежуточное программное обеспечение в качестве функции обратного вызова

Проблема, о которой я думаю, заключается в определениях модулей (bear и bat), модули должны обрабатывать маршрутизацию на их концах, используйте экспресс.Класс маршрутизатора для создания модульных, монтируемых обработчиков маршрутов.

 var express = require('express')
var router = express.Router()

// middleware that is specific to this router
router.use(function timeLog (req, res, next) {
  console.log('Time: ', Date.now())
  next()
})
// define the home page route
router.get('/', function (req, res) {
    let bearArray = [
        {id:1, name:"polar bear"},
        {id:2, name:"grizzly bear"},
        {id:3, name:"panda bear"}
    ]

    res.send(bearArray);
})

module.exports = router
  

и

 var express = require('express')
var router = express.Router()

// middleware that is specific to this router
router.use(function timeLog (req, res, next) {
  console.log('Time: ', Date.now())
  next()
})
// define the home page route
router.get('/', function (req, res) {
    let batArray = [
        {id:1, name:"black bat"},
        {id:2, name:"brown bat"}
    ]

    res.send(batArray);
})

module.exports = router
  

https://expressjs.com/en/guide/routing.html

Комментарии:

1. Большое спасибо, вдохновитель, проблема с маршрутизацией.

Ответ №3:

Взгляните на свой код здесь :

 app.use('/',bearModeule); // this means return bearModeule for all requests at localhost:3000
app.use('/bat',batModule); // this means return batModule for all requests at localhost:3000/bat
  

app.use() определяет промежуточное программное обеспечение, которое будет использоваться при совпадении соответствующего маршрута. Когда вы нажимаете localhost: 3000 / bat, запускается запрос bearModeule. Вы можете видеть, что консоль выводит сообщение об ошибке, что заголовки не могут быть установлены после их отправки. Это потому, что ваш запрошенный маршрут уже вернул ответ.

Вы должны указать другой маршрут для модуля bear.

 app.use('/bear', bearModeule) 
  

Или, если вы хотите сначала вернуть batModule, вы можете изменить порядок маршрутов.

 app.use('/bat',batModule);
app.use('/', bearModeule);
  

Это будет работать, но это все еще неправильный способ сделать это.
Также вам следует использовать app.get, если вы хотите определить его как конечную точку.