我们如何将参数传递到nodeJS中的已安装路由?

如何解决我们如何将参数传递到nodeJS中的已安装路由?

我正在上NodeJS课程,其中有一些与路由相关的作业,除了这部分似乎还有些奇怪之外,其他一切工作都很好:由于某种原因,我无法读取传递给已安装路由器的参数ID。

dish.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;

dishes.js

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

dishesRouter.use(bodyParser.json());

dishesRouter.route('/')
.all((req,'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,'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 调用了正确的路由,但是参数盘ID返回为“未定义”。再次,仅学习nodeJS,似乎我的接收器/安装的路由应该接收那些参数就好了,可以正确读取主体,但不能读取参数。 ...谢谢。

解决方法

是的,参数不会在路由器之间流动。您在新路由器上,因此是新的路由参数对象。

您可以查看以下代码: https://github.com/expressjs/express/blob/master/lib/router/index.js#L43 检出第43行和第53行,其中route.params设置为空对象。

一些例子:

index.js

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

dish.js(版本1)

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

dish.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

我不确定是否存在offical-expressjs-way在路由器之间传递params对象。

一种解决方案是创建自定义处理程序

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

另一种方法是在调用路由器之前将dishId添加到请求对象:

index.js

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

dish.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

第三种方式是将参数作为选项发送到路由器功能

index.js

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

dish.js

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

  return router
}

module.exports = createRouter

如果需要,您也可以将:dishId作为可选参数放置在路由器上

index.js

app.use('/dishes',dishesRouter)

dishes.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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-