NodeJS:如何使用诸如req,res之类的参数生成函数?

时间:2019-06-18 20:12:20

标签: javascript node.js express

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

在许多教程中,我看到了类似这样的东西:

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

以:“ somecode”为例,例如获取请求

是“结果”返回值的名称,还是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);
    });
};

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

还需要一个参数:

req.params.userId 
路径网址中的

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

如果我更改参数名称对不对?例如:

req.params.id

很抱歉很长一段时间,我正在尝试了解JS逻辑以养成良好的习惯并编写简洁的代码。

谢谢!

4 个答案:

答案 0 :(得分:1)

  

是“结果”返回值的名称,还是JS开发人员使用的约定?我的意思是,例如,这行得通吗?

根据我的经验,是的-经常使用result。通常,您会看到类似valueresponse之类的东西,但最终它可以是您定义的任何东西。我建议您遵循惯例,如果您刚开始了解NodeJS异步操作,也请查阅MDN Promise tutorial

  

对于req,res变量又意味着什么?

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

这是中间件链。请查看Express docs,以了解更多信息。

  

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

req.params.userId 
  网址中的

如果我正确更改参数名称,将不起作用?例如:

req.params.id

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

答案 1 :(得分:1)

  

是“结果”返回值的名称,还是JS开发人员使用的约定?

b是您要创建的新变量的名称,以表示从result分辨率传入的值。是的,您的Promise示例将起作用。

foo与看起来像这样的函数(大部分)相同:

(req, res) => {}

function getById(req, res) {...} req只是要传递给此函数的值的代表。他们可以很容易地被称为res

答案 2 :(得分:1)

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

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

实际上是:

somecode.then(myFunction);

由于somecode是一个承诺,因此您的函数可以使用零或一个参数来调用。您可以自行指定以下参数:

function myFunction (foo) {
    // use foo here
}

somecode.then(myFunction);

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

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

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

Express.js和http.Server

在节点的http.Server库和Express.js框架中,每个服务器请求都将调用您定义的函数,并向其传递两个参数:请求对象和响应对象。变量reqres只是人们在编写自己的请求处理程序函数时使用的约定。您可以随意命名。例如,您可能更喜欢使用requestresponserxtx

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

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

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

Express.js实际上会将三个参数传递给您的回调(而不是两个!)-requestresponsenext,其中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参数,则允许您仅使用两个参数声明所述回调。

答案 3 :(得分:1)

您似乎在努力理解回调函数。考虑以下代码,然后请打开您正在使用的程序包的源代码。看起来您正在使用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实际上可以是任何值,为了有效,我传回了一个数字和一个字符串,分别为reqres