我对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逻辑以养成良好的习惯并编写简洁的代码。
谢谢!
答案 0 :(得分:1)
是“结果”返回值的名称,还是JS开发人员使用的约定?我的意思是,例如,这行得通吗?
根据我的经验,是的-经常使用result
。通常,您会看到类似value
,response
之类的东西,但最终它可以是您定义的任何东西。我建议您遵循惯例,如果您刚开始了解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
的值方面也略有不同)
在节点的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
参数,则允许您仅使用两个参数声明所述回调。
答案 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
实际上可以是任何值,为了有效,我传回了一个数字和一个字符串,分别为req
和res
。