目前,我所有其他路由的下方都有以下内容:

app.get('*', function(req, res){
  console.log('404ing');
  res.render('404');
});

根据日志(log),即使在上面匹配了路由,它也会被触发.我怎样才能让它在没有匹配的情况下才开火?

推荐答案

你只需要把它放在所有路由的尽头.

看看Passing Route Control的第二个例子:

var express = require('express')
  , app = express.createServer();

var users = [{ name: 'tj' }];

app.all('/user/:id/:op?', function(req, res, next){
  req.user = users[req.params.id];
  if (req.user) {
    next();
  } else {
    next(new Error('cannot find user ' + req.params.id));
  }
});

app.get('/user/:id', function(req, res){
  res.send('viewing ' + req.user.name);
});

app.get('/user/:id/edit', function(req, res){
  res.send('editing ' + req.user.name);
});

app.put('/user/:id', function(req, res){
  res.send('updating ' + req.user.name);
});

app.get('*', function(req, res){
  res.send('what???', 404);
});

app.listen(3000); 

或者,您什么也不能做,因为所有不匹配的路由都将生成404.然后可以使用以下代码显示正确的模板:

app.error(function(err, req, res, next){
    if (err instanceof NotFound) {
        res.render('404.jade');
    } else {
        next(err);
    }
});

记录在Error Handling页.

Node.js相关问答推荐

使用OpenAI API时遇到问题

对接Nestjs/VueJS应用程序

express返回意外的URL

Firebase-admin筛选器.或只考虑第一个WHERE子句

Mongoose-如何从父文档填充到子文档

验证器功能在mongoose 中不起作用

Prisma 和 Nextjs:重新部署之前内容不会更新

Redis Typescript 删除方法类型转换

我如何在nodejs中的路由之间交换令牌

如何获取需要加载cheerio的网站部分数据?

将环境变量从 GitHub 操作传递到 json

mongoose.model() 方法返回未定义

如何在 node.js 环境中从 WebAssembly (Rust) 调用异步 JavaScript 导入函数?

Node.js, require.main === 模块

npm package.json 操作系统特定脚本

chart.js 无法创建图表:无法从给定项目获取上下文

node.js 服务器和 HTTP/2 (2.0) 与 express.js

如何从 Node.js 应用程序Ping?

npm install packagename --save-dev 不更新 package.json

避免在弹性 beantalk 中重建 node_modules