【问题标题】:NodeJS express routing with routerNodeJS 使用路由器快速路由
【发布时间】:2018-09-27 03:08:53
【问题描述】:

我已经用 express 生成器生成了节点项目

主 app.js 文件

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var detailRouter = require('./routes/user-detail');
var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/users/:userId', detailRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

用户详细信息路由器文件

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

router.get('/', (req, res, next) =>{
  res.send("Name is:"+req.params.userId);
})
module.exports = router;

当我使用 npm start 运行应用程序时 我得到 req.params.userdId == undefned

代码有问题还是我遗漏了什么。

此外,当我在 app.js 中使用以下代码时,它工作得非常好

app.get('/users/:userid', (req,res,next) => {
  res.send(req.params);
})

提前致谢。

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    是的,你做错了。参数意味着您需要在 url 中传递一些参数。如下所示

    app.use('/:userId', indexRouter);
    

    并且需要改变

    router.get('/:userId', (req, res, next) =>{
          res.send("Name is:"+req.params.userId);
    })
    

    【讨论】:

    • 成功了。谢谢 但是,这是唯一的方法吗?因为如果我还有一个路径示例 '/test' 那么如果我点击 localhost:3000/test/harsh 或 localhost:3000/users/harsh 两者都会去 '/:userId' 纠正我如果我错了。有没有办法用层次结构定义路径?谢谢
    • 你可以使用RequestBody,你可以传递你的数据
    • 如果你得到了答案,那么你可以接受我的答案
    • 没有告诉你“RequestBody”与 POST 有关。我如何在 GET 调用中使用它。我想你没有得到我的问题。示例: '/test' 、'/users' 、 '/:userId' 在这两种情况下都可以使用。这是一种独立路径节点是否提供类似 '/users/:userId' 的东西?如果不是,那么 post 或 queryParams 是否只是选项?
    • 这就是我的意思,如果你使用的是/users/:userId,那么你需要使用req.params.userId,否则使用post
    【解决方案2】:

    如果你想通过 url 访问 GET 传递的参数的值,请这样做

    const { id } = req.query

    在这种情况下,您可以访问 URL 中传递的参数值:

    http://yoursite.com/users?id=somevalue

    【讨论】:

    • 感谢克里斯蒂安,但我不想将值作为查询传递
    【解决方案3】:

    除了Sangram's 答案之外,您还可以将路由方法与路由器实例一起使用,以获得更清晰可读的代码,如下所示。

    import { Router } from 'express';
    import {
      readOne,
      updateOne,
      deleteOne
    } from './controller';
    
    const router = new Router();
    router
      .route('/:id')
      .get(readOne)
      .put(updateOne)
      .delete(deleteOne);
    
    export default router;
    

    【讨论】:

      猜你喜欢
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      相关资源
      最近更新 更多