【问题标题】:NodeJS : how to use arguments like req, res, result in functions?NodeJS:如何在函数中使用 req、res、result 等参数?
【发布时间】:2019-11-01 12:41:44
【问题描述】:

我对 JS 非常陌生,尤其是 Node 和 Express。我正在关注一些关于如何构建 API 的教程,同时学习 JS 的特殊功能,例如 let/const/var、箭头函数等。

在很多教程中我都看到过这样的事情:

somecode.then((result) => {someothercode})

其中:“somecode”例如是一个获取请求

“result”是返回值的名称还是 JS 开发者使用的约定? 我的意思是,这是否有效?

somecode.then((foo) => {someothercode})

还有对于req、res变量是什么意思?

app.get("/users/:userId", [
        usersController.getById
    ]);

这里是 getById 函数(再次使用“结果”):

exports.getById = (req, res) => {
    userModel.findById(req.params.userId).then((result) => {
        res.status(200).send(result);
    });
};

控制器需要(req, res)中定义的getById方法,是不是意味着,当我像上面的代码那样调用它时,req和res参数被隐式使用了?

还需要一个参数:

req.params.userId 

在路由的url中,它如何传递给另一个文件? 我有一个使用 model.js 的 controller.js 文件的 route.js 文件。参数如何从路由到控制器?

如果我更改参数名称,它不会起作用吗?例如:

req.params.id

对不起,长篇大论,我正在尝试理解 JS 逻辑以养成一些好习惯并编写干净的代码。

谢谢!

【问题讨论】:

  • 这些都是常规的变量名,你可以使用任何你想要的名字。
  • 箭头左侧的名称是您选择赋予传递给函数的参数的名称。
  • @Barmar 那么参数的顺序在 (req,res) 的情况下很重要,如果我喜欢 (res, req) 那么 res 将是请求,req 是响应?跨度>
  • 完全正确。 Express 按特定顺序传递它们,您有责任为它们指定与角色匹配的名称。
  • app.get(route,requestHandler) 是 http 请求的语法。在您的情况下,“usersController.getById”函数实际上是一个请求处理程序。任何请求处理程序都将按此特定顺序具有 (req,res) 参数。

标签: javascript node.js express


【解决方案1】:

“result”是返回值的名称还是 JS 开发者使用的约定?我的意思是,这是否有效?

根据我的经验,是的 - result 经常被使用。通常你会看到value、response 之类的东西,但最终它可以是你定义的任何东西。我建议您遵守约定,如果您刚开始了解 NodeJS 异步操作,还可以查看 MDN Promise tutorial。

还有对于req、res变量是什么意思?

app.get("/users/:userId", [
        usersController.getById
    ]);

这是一个中间件链。查看Express docs了解更多信息。

控制器需要(req,res)中定义的getById方法,这是否意味着当我像上面的代码一样调用它时,隐式使用req和res参数?它还需要一个参数:

req.params.userId 

这是在 url 如果我更改参数名称将无法正常工作吗?例如:

req.params.id

是的,那是使用命名参数。如果没有完整的路由代码,很难知道getById 方法是如何链接到定义的路由的。 Express routing documentation 可能是一个好的开始。

【讨论】:

  • result 恕我直言,代码的味道。实际的好习惯是给 promise 的结果一个有意义的名称:statistics 或 user 或 price 等。对于短的单行转换器(例如 x => x.json()),我会使用单个字符名称- 与短 for 循环相同的规则
【解决方案2】:

“result”是返回值的名称还是 JS 开发者使用的约定?

result 是您正在创建的新变量的名称,用于表示从Promise 解析传入的值。是的,您的 foo 示例将起作用。

(req, res) => {} 与(大部分)看起来像这样的函数相同:

function getById(req, res) {...}

req 和 res 只是表示将传递给此函数的值。他们可以很容易地被称为(foo, bar)。

【讨论】:

  • 所以如果 (req, res) 可以是任何东西,这意味着参数的顺序很重要,对吧? (foo, bar) 表示 foo 是请求对象,而 bar 是响应?
  • @pida 对!参数必须按顺序传递。为了绕过这个限制,您经常会看到函数采用键值对的对象,其中顺序无关紧要。
【解决方案3】:

您似乎在努力理解回调函数。请考虑以下代码,然后请打开您正在使用的软件包的源代码。看起来你正在使用express.js

function something(callback) {
  var x = 5;
  var y = 'anything';
  callback(x, y);
}

something(function(req, res) {
  console.log(req);
  console.log(res);
});

something 函数被创建并且在该函数范围内,var x 和 y 被创建为任何类型。然后当我们调用或使用某个函数时,我们将一个函数作为变量传递,该变量作为变量 callback 传递,那么它可以被使用,因为它是一个函数,所以我们用 x 和 y 调用 callback,这实际上可以是任何值和效果,我将一个数字和一个字符串作为req 和res 传回。

【讨论】:

    【解决方案4】:

    这只是一个约定。注意代码:

    somecode.then((result) => {someothercode});
    

    其实是:

    somecode.then(myFunction);
    

    由于somecode 是一个Promise,你的函数可以用零个或一个参数调用。由你来命名这个参数:

    function myFunction (foo) {
        // use foo here
    }
    
    somecode.then(myFunction);
    

    当然,与其他一些语言不同,javascript 不会强制您为函数命名。您可以只使用无名(匿名)函数:

    somecode.then(function(mango) { /* use mango here */ })
    

    箭头函数是一种新语法,允许您以更短的样式编写匿名函数(它的作用域和this 的值也略有不同)

    Express.js 和 http.Server

    在 node 的 http.Server 库和 Express.js 框架中,每个服务器请求都会调用一个你定义的函数并传递给它两个参数:请求对象和响应对象。变量req 和res 只是人们在编写自己的请求处理函数时使用的约定。您可以为它们命名任何您喜欢的名称。例如,您可能更喜欢使用request 和response 或rx 和tx:

    app.get('/say/hello', (rx, tx) => tx.send('Hello'));
    

    我用多少个参数编写回调函数??

    最好的方法是阅读您正在使用的模块的文档。这不是唯一的了解方式——您当然可以改为阅读源代码。但是阅读文档通常更容易。因此,javascript 模块往往具有非常好的文档(否则它们将无法使用并被社区忽略)。

    Express.js 实际上会将三个参数传递给您的回调(不是两个!!)-request、response 和 next 其中next 是一个函数,如果您希望 Express 继续处理,则可以调用回复请求。 javascript 的一个有趣的特性是,您可以调用具有更少或更多参数的函数,这不被视为语法错误:

    function example (x) {}
    example(); // not an error
    example(1); // not an error
    example(1,2,3,4); // also not an error
    

    Express 通过始终使用三个参数调用您的回调来使用此功能,而如果您不需要第三个 next 参数,则允许您仅使用两个参数声明所述回调。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      相关资源
      最近更新 更多