【问题标题】:How to combine app.post and app.get to one in node js如何在 node js 中将 app.post 和 app.get 合二为一
【发布时间】:2019-02-01 15:30:24
【问题描述】:

我正在尝试为登录页面发布和获取请求制作一个路由器。

下面是我的代码:

  app.get('/login', getLoginPage);
  app.post('/login', doLogin);

我在这里使用 app.all 来结合两者,但我不知道如何处理它。

到目前为止我已经尝试过什么。

app.all('/login', handler); 
var handler = function(req, res){
   console.log(req);
   if(req.method=="POST")
   {
   getLoginPage;
   }
   if(req.method=="GET")
   {
   doLogin
   }
}

const {getLoginPage,doLogin} = require('./controller/login');

这里 app.get 和 app.post 对我来说工作正常,除了 app.all。 这里我使用的是 express js。 请提出建议。

【问题讨论】:

  • 这是 expressJS 还是其他的。?
  • 是快递js。
  • 请参阅this 是否可以解释为什么 app.all 不适合您?

标签: node.js express


【解决方案1】:

我会这样做(完整的工作示例):

var express = require('express');
var app = express();


app.route('/test')
  .get((req, res) => getLoginPage(req, res))
  .post((req, res) => doLogin(req, res))

doLogin = (req, res) => {
  res.send('doLogin');
}

getLoginPage = (req, res) => {
  res.send('getLoginPage');
}

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

【讨论】:

  • 我添加了一个完整的工作示例。如果你不能让它运行,请检查你的 node/express 版本。
  • 我已安装:节点 10.14.1 并使用 express 4.16.3 - 不确定,但我猜它应该适用于您的版本。这个例子不适合你吗?你如何测试它,你期望什么?当此示例运行时,对路由 localhost:3000/test 的简单 get 和 post 请求应回复为“doLogin”或“getLoginPage”
  • 错误地,我写了 localhost:4000/test 而不是 localhost:4000/login,这里我的目标是编写一个代码,而不是在 get() 和 post() 中线。出于学习目的,我是node js的新手并正在学习它。谢谢你的建议。
  • 始终是减少代码行数的好方法 - 但在这种情况下,您必须区分 get 和 post - 要么使用 req.method 上的 if else 语句来做到这一点(参见 @ROAL答案)或者您为此使用回调。我会按照 express 文档的建议推荐回调。
【解决方案2】:

吊装!!!

这真的只是范围。你有一个函数表达式,而不是一个声明。声明会被提升,但定义不会。因此,当您调用处理程序时,尚未定义处理程序,因为它的函数表达式在它下面。

因此无需更改您的代码,除了事情的顺序。这样做,它会工作的

var handler = function(req, res) {
  if (req.method == "POST") {
    console.log("POST");
  }
  if (req.method == "GET") {
    console.log("GET");
  }
};

app.all("/login", handler);

了解函数声明与表达式中的作用域

【讨论】:

    【解决方案3】:

    您需要调用 app.all 处理程序中的函数。

    app.all('/login', handler);
    var handler = function (req, res) {
        console.log(req);
        if (req.method == "POST") {
            getLoginPage(req, res);
        }
        if (req.method == "GET") {
            doLogin(req, res);
        }
    }
    

    【讨论】:

    • 执行此操作后,我收到此错误; Route.acl() 需要一个回调函数,但得到了一个 [object Undefined]
    • @sradha 抱歉,您没有在处理程序中使用 next。我已经编辑了答案。无论如何,@DavidJoos 有更好的建议。看看他的回答。
    【解决方案4】:

    试试下面的使用方法。它将接受所有类型的方法,您可以在那里应用条件:

    app.use('/login', function (req, res, next) {
      console.log('Request Type:', req.method)
      if(req.method=="POST")
      {
        getLoginPage;
      }
      else if(req.method=="GET")
      {
        doLogin;
      }
    });

    【讨论】:

      【解决方案5】:

      尝试调用函数并将 req 和 res 参数传递给这些函数

      app.all('/login', handler); 
      function handler(req, res){
        if(req.method=="POST"){
          getLoginPage(req, res);
        } else if(req.method=="GET"){
          doLogin(req, res);
        }
      }
      

      编辑:更改为函数声明而不是函数表达式以避免提升问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-24
        • 2022-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多