2

私は NodeJS のコースを受講しています。ルーティングに関連する割り当てがいくつかありましたが、少し奇妙に思えるこの部分を除いてすべて正常に動作します。何らかの理由で、マウントされたルーターに渡されるパラメーター ID を読み取ることができません。

皿.js

const express = require('express');
const bodyParser = require('body-parser');
const dishRouter = express.Router();

dishRouter.use(bodyParser.json());

dishRouter.route('/')
.all((req,res,next) => {
    res.statusCode = 200;
    res.setHeader('Content-Type','text/plain');
    next();
})
.get((req,res) => {
    console.info('Info: ',req);
    res.end(`Sending details of the dish back to you: ${req.params.dishId}`);
})
.post((req,res) => {
    res.statusCode = 403;
    res.end(`Operation not supported: ${req.params.dishId}`);
})
.put((req,res) => {
    res.write(`Updating the dish...: ${req.params.dishId} \n` );
    res.end(`Will update this dish: ${req.body.name} with details: ${req.body.description}`);
})
.delete((req,res) => {
    res.end(`Deleting this dish: ${req.params.dishId}`);
});

exports.dish = dishRouter;

皿.js

const express = require('express');
const bodyParser = require('body-parser');
const dishesRouter = express.Router();

dishesRouter.use(bodyParser.json());

dishesRouter.route('/')
.all((req,res,next) => {
    res.statusCode = 200;
    res.setHeader('Content-Type','text/plain');
    next();
})

.get((req,res) => {
    res.end('Sending all dishes back to you');
})  

.post((req,res) => {
    res.end(`Will add the dish: ${req.body.name} with details: ${req.body.description}`);
})

.put((req,res) => {
    res.statusCode = 403;
    res.end(`Operation not supported.`);
})

.delete((req,res) => {
    res.end(`Deleting all dishes.....`);
});

exports.dishes = dishesRouter;

index.js

const express = require('express');
const morgan = require('morgan');
const bodyParser = require('body-parser');
const http = require('http');
const dishRouter = require('./routes/dish');
const dishesRouter = require('./routes/dishes');
const hostname = 'localhost';
const port = 3000;

const app = express();
app.use(morgan('dev'));
app.use(bodyParser.json());

app.use('/dishes',dishesRouter.dishes);
app.use('/dishes/:dishId',dishRouter.dish);

app.use(express.static(__dirname+'/public'));

app.use((req,res,next) => {
    res.statusCode = 200;
    res.setHeader('Content-Type','text/html');
    res.end('<html><body><h1>This is an Express Server</h1></body></html>');
});

const server = http.createServer(app);

server.listen(port,hostname,(req,res) => {
   console.info(`Server running on port: ${port}, at: ${hostname}`);
})

この GET localhost:3000/dishes/123は正しいルートを呼び出していますが、dishId パラメータは「未定義」として返されます。繰り返しになりますが、nodeJS を学習するだけで、レシーバー/マウントされたルートはこれらのパラメーターを問題なく受け取る必要があるようです。本体は適切に読み取ることができますが、パラメーターは読み取れません。... ありがとう。

4

1 に答える 1

1

ええ、パラメーターはルーター間を流れません。あなたは新しいルーターを使用しているため、新しいルートパラメーターオブジェクトです。

このコードを確認できます: https://github.com/expressjs/express/blob/master/lib/router/index.js#L43 43 行目と 53 行目を確認してください。物体。

いくつかの例:

index.js

app.use('/dishes/:dishId',(req, res) => {
  console.log('now I get my dishId', req.params.dishId)
});

皿.js (バージョン 1)

dishRouter.route('/')
.get((req, res) => {
  console.log('now i get nothing', req.params)
})

皿.js (バージョン 2)

dishRouter.route('/:anotherId')
.get((req, res) => {
  console.log('now we get another parameter', req.params.anotherId)
})
// the path would be /dish/123/456

ルーター間で params オブジェクトを渡すための公式の Expressjs の方法があるかどうかはわかりません。

1 つの解決策は、カスタム ハンドラーを作成することです。

index.js

app.use('/dishes/:dishId', handler)

handler.js

function handler (req, res, next) {
  if (req.method === 'GET') {
    console.log('now we get it', req.params)
  }
}

module.exports = handler

もう 1 つの方法は、ルーターを呼び出す前に、dishId をリクエスト オブジェクトに追加することです。

index.js

app.use('/dishes/:dishId', (req, res, next) => {
  req.dishId = req.params.dishId
  router(req, res, next)
})

皿.js

const express = require('express')
const router = express.Router()
  router.route('/')
  .get((req, res) => {    
    console.log('nothing here', req.params)
    console.log('dishId', req.dishId)
  })

module.exports = router

3番目の方法は、パラメーターをオプションとしてルーター機能に送信することです

index.js

app.use('/dishes/:dishId', (req, res, next) => {
  router(req.params)(req, res, next)
})

皿.js

function createRouter (options) {
  const router = express.Router()
  router.route('/')
  .get((req, res) => {    
    console.log('nothing here', req.params)
    console.log('but alot here', options)
  })

  return router
}

module.exports = createRouter

必要に応じて、ルーターに :dishId をオプションのパラメーターとして配置することもできます

index.js

app.use('/dishes', dishesRouter)

皿.js

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

router.route('/:dishId?')
  .get((req, res) => {        
    if (req.params.dishId) {
      res.end(`Sending details of the dish back to you: ${req.params.dishId}`)
    } else {
      res.end('Sending all dishes back to you');
    }
  })

module.exports = router
于 2020-09-09T22:53:02.233 に答える