【问题标题】:when to use app.use() in Node express app何时在 Node express 应用中使用 app.use()
【发布时间】:2018-10-14 12:29:45
【问题描述】:

我试图理解我们什么时候需要在我们的节点 Express 中使用 app.use

在网上搜索时,我在reddit stating the difference between app.get 和 app.use 上偶然发现了这个答案

基于此,我能够总结出以下几点。

app.use 充当超级路由还是中间件?这意味着它在app.use 下方/之后写的每条路线上都会被调用?

另外,如果有人可以添加有关 app.use 的更多信息/实践,我将不胜感激。

【问题讨论】:

标签: node.js express


【解决方案1】:

在将 ExpressJS 与 NodeJS 结合使用时,您可以将 app.getapp.use 用于几个有用的方面。

let app = express();这样初始化你的应用程序后,你可以在下面找到一些例子:

app.use(...)

正如您正确指出的那样,它对“中间件”很有用,它将适用于您指明后记的所有 GET、POST 等。例如,您只能在想要“使用用户/通过身份验证”的 GET 之前使用中间件。

  • 为静态内容指明文件夹:app.use(express.static(__dirname + "/public"));

  • 包含 JSON 内容的解析器:app.use(bodyParser.json());

  • 定义“Cookie Parser”签名字符串:app.use(cookieParser("Signing text example"));

  • 为不同文件中的 URL 使用单独的路由器:app.use("/api", apiRouter);app.use("/news", newsRouter);app.use("/", siteRouter);

  • 对于自定义错误处理程序:app.use(sites404handler);app.use(globalErrorHandler);

app.get(...)

在谈论app.get(...) 时,您是在指明将通过 GET 方法访问哪些 URL。但是你可以在这里使用几个选项:

  • 表明你有一个主页:app.get("/", function(req, res) { res.send("Hello world!"); });

  • 接受 POST 请求:app.post("/", function(req, res) { res.send("Hello world! With POST call."); });

  • 您也可以将其分离到另一个文件中作为“apiRouter.js”并包含在其中:let router = express.Router(); router.route("/books").get(function(req, res) { res.send("/api/books/ called via a Router"); });

app.set(...)

请记住,您还可以选择 app.set(...)。例如,这对于定义 Handlebars(.hbs 文件)等视图引擎很有用。

希望这能有所帮助!

【讨论】:

    【解决方案2】:
    1. 用于静态路径

      //Set static path
      app.use(express.static(__dirname + '/public'));
      
    2. 用作路由器

      //user
      app.use('/', require('./controllers/user'));
      
    3. 用于handline中间件

      //Body-parser
      app.use(bodyParser.json());
      app.use(bodyParser.urlencoded({
          extended: true
      }));// Body parser use JSON data
      
    4. 用于自定义中间件

      // force https
      app.use ( (req, res, next) =>{
          if (req.secure) {
              // request was via https, so do no special handling
              next();
          } else {
              // request was via http, so redirect to https
              res.redirect('https://' + req.headers.host + req.url);
          }
      });
      

    【讨论】:

    • 马来文,确认一下。这么说是对的:app.use 充当超级路由还是中间件?这意味着它会在 app.use 下面/之后编写的每条路线上被调用?
    • 两者兼得,路由器也是中间件:)
    • @KuchBhi 使用app.use() 作为超级路由器第一个参数是/,即顶级路由
    【解决方案3】:

    app.get 路由处理程序is applied to GET requests,对于指定路径或所有路径:

    使用指定的回调函数将 HTTP GET 请求路由到指定路径。

    app.use中间件is applied to all requests,无论是指定路径还是所有路径:

    在指定路径挂载指定的中间件函数或函数:当请求路径的基数与路径匹配时执行中间件函数。

    use 用于将一些逻辑(中间件)应用到特定路由或整个应用程序,无论请求方法如何。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      • 2015-02-14
      • 2017-12-31
      • 2016-10-25
      • 2015-05-11
      相关资源
      最近更新 更多