diff --git a/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/chain-middleware-to-create-a-time-server.chinese.md b/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/chain-middleware-to-create-a-time-server.chinese.md index 1e5a9ef366..dc2cbb94ae 100644 --- a/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/chain-middleware-to-create-a-time-server.chinese.md +++ b/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/chain-middleware-to-create-a-time-server.chinese.md @@ -6,8 +6,8 @@ challengeType: 2 --- ## Description -
0使用app.METHOD(path, middlewareFunction)可以在特定路径上安装app.METHOD(path, middlewareFunction) 。中间件也可以在路由定义中链接。 0查看以下示例: -
app.get('/user', function(req, res, next) {
req.user = getTheUserSync(); // Hypothetical synchronous operation
next();
}, function(req, res) {
res.send(req.user);
})
0此方法可用于将服务器操作拆分为较小的单元。这导致了更好的应用程序结构,以及在不同位置重用代码的可能性。此方法还可用于对数据执行某些验证。在中间件堆栈的每个点,您可以阻止当前链的执行,并将控制权传递给专门用于处理错误的函数。或者您可以将控制权传递给下一个匹配的路径,以处理特殊情况。我们将在高级Express部分中看到如何。 0在路径app.get('/now', ...)链中间件函数和最终处理程序。在中间件功能中,您应该在req.time键中将当前时间添加到请求对象。您可以使用new Date().toString() 。在处理程序中,使用JSON对象进行响应,采用结构{time: req.time}0提示:如果不链接中间件,测试将无法通过。如果将函数挂载到其他位置,即使输出结果正确,测试也会失败。 +
使用app.METHOD(path, middlewareFunction)可以在特定路径上安装app.METHOD(path, middlewareFunction) 。中间件也可以在路由定义中链接。查看以下示例: +
app.get('/user', function(req, res, next) {
req.user = getTheUserSync(); // Hypothetical synchronous operation
next();
}, function(req, res) {
res.send(req.user);
})
此方法可用于将服务器操作拆分为较小的单元。这导致了更好的应用程序结构,以及在不同位置重用代码的可能性。此方法还可用于对数据执行某些验证。在中间件堆栈的每个点,您可以阻止当前链的执行,并将控制权传递给专门用于处理错误的函数。或者您可以将控制权传递给下一个匹配的路径,以处理特殊情况。我们将在高级Express部分中看到如何。在路径app.get('/now', ...)链中间件函数和最终处理程序。在中间件功能中,您应该在req.time键中将当前时间添加到请求对象。您可以使用new Date().toString() 。在处理程序中,使用JSON对象进行响应,采用结构{time: req.time} 。提示:如果不链接中间件,测试将无法通过。如果将函数挂载到其他位置,即使输出结果正确,测试也会失败。
## Instructions diff --git a/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/get-data-from-post-requests.chinese.md b/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/get-data-from-post-requests.chinese.md index 134fbfedc3..ba858b2d60 100644 --- a/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/get-data-from-post-requests.chinese.md +++ b/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/get-data-from-post-requests.chinese.md @@ -6,12 +6,12 @@ challengeType: 2 --- ## Description -
0在路径/name处安装POST处理程序。它和以前一样。我们在html首页中准备了一个表单。它将提交练习10(查询字符串)的相同数据。如果正确配置了body-parser,您应该在对象req.body找到参数。看看通常的库示例: -
route: POST '/library'
urlencoded_body: userId=546&bookId=6754
req.body: {userId: '546', bookId: '6754'}
0使用与以前相同的JSON对象进行响应: {name: 'firstname lastname'} 。使用我们在应用程序首页中提供的html表单测试您的端点是否正常工作。 0提示:除了GET和POST之外,还有其他几种http方法。按照惯例,http动词与您要在服务器上执行的操作之间存在对应关系。传统的映射是: +
在路径/name处安装POST处理程序。它和以前一样。我们在html首页中准备了一个表单。它将提交练习10(查询字符串)的相同数据。如果正确配置了body-parser,您应该在对象req.body找到参数。看看通常的库示例: +
route: POST '/library'
urlencoded_body: userId=546&bookId=6754
req.body: {userId: '546', bookId: '6754'}
使用与以前相同的JSON对象进行响应: {name: 'firstname lastname'} 。使用我们在应用程序首页中提供的html表单测试您的端点是否正常工作。 提示:除了GET和POST之外,还有其他几种http方法。按照惯例,http动词与您要在服务器上执行的操作之间存在对应关系。传统的映射是: POST(有时是PUT) - 使用随请求发送的信息创建新资源, GET - 读取现有资源而不修改它, PUT或PATCH(有时是POST) - 使用数据更新资源已发送, -DELETE =>删除资源。 0还有一些其他方法用于协商与服务器的连接。除了GET之外,上面列出的所有其他方法都可以有一个有效载荷(即数据进入请求体)。身体解析器中间件也适用于这些方法。 +DELETE =>删除资源。 还有一些其他方法用于协商与服务器的连接。除了GET之外,上面列出的所有其他方法都可以有一个有效载荷(即数据进入请求体)。身体解析器中间件也适用于这些方法。
## Instructions diff --git a/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/get-query-parameter-input-from-the-client.chinese.md b/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/get-query-parameter-input-from-the-client.chinese.md index 4c94488b68..8227da6bbe 100644 --- a/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/get-query-parameter-input-from-the-client.chinese.md +++ b/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/get-query-parameter-input-from-the-client.chinese.md @@ -6,13 +6,13 @@ challengeType: 2 --- ## Description -
0从客户端获取输入的另一种常用方法是使用查询字符串对路径路径后的数据进行编码。查询字符串由问号(?)分隔,并包括field = value couple。每对夫妇用和号(&)隔开。 Express可以解析查询字符串中的数据,并填充对象req.query 。某些字符不能在URL中,它们必须以不同的格式编码才能发送它们。如果您使用JavaScript中的API,则可以使用特定方法对这些字符进行编码/解码。 -
route_path: '/library'
actual_request_URL: '/library?userId=546&bookId=6754'
req.query: {userId: '546', bookId: '6754'}
0构建一个以GET /name挂载的API端点。使用结构{ name: 'firstname lastname'}回复JSON文档。名字和姓氏参数应该在查询字符串中编码,例如?first=firstname&last=lastname0提示:在下面的练习中,我们将在相同/name路径路径的POST请求中接收数据。如果需要,可以使用方法app.route(path).get(handler).post(handler) 。此语法允许您在同一路径路径上链接不同的动词处理程序。您可以节省一些打字,并拥有更清晰的代码。 +
从客户端获取输入的另一种常用方法是使用查询字符串对路径路径后的数据进行编码。查询字符串由问号(?)分隔,并包括field = value couple。每对夫妇用和号(&)隔开。 Express可以解析查询字符串中的数据,并填充对象req.query 。某些字符不能在URL中,它们必须以不同的格式编码才能发送它们。如果您使用JavaScript中的API,则可以使用特定方法对这些字符进行编码/解码。 +
route_path: '/library'
actual_request_URL: '/library?userId=546&bookId=6754'
req.query: {userId: '546', bookId: '6754'}
## Instructions
- +构建一个以GET /name挂载的API端点。使用结构{ name: 'firstname lastname'}回复JSON文档。名字和姓氏参数应该在查询字符串中编码,例如?first=firstname&last=lastname 。 提示:在下面的练习中,我们将在相同/name路径路径的POST请求中接收数据。如果需要,可以使用方法app.route(path).get(handler).post(handler) 。此语法允许您在同一路径路径上链接不同的动词处理程序。您可以节省一些打字,并拥有更清晰的代码。
## Tests diff --git a/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/get-route-parameter-input-from-the-client.chinese.md b/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/get-route-parameter-input-from-the-client.chinese.md index 9074d50fb7..0c2159db13 100644 --- a/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/get-route-parameter-input-from-the-client.chinese.md +++ b/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/get-route-parameter-input-from-the-client.chinese.md @@ -6,13 +6,13 @@ challengeType: 2 --- ## Description -
0构建API时,我们必须允许用户与我们沟通他们希望从我们的服务中获得什么。例如,如果客户端请求有关存储在数据库中的用户的信息,他们需要一种方法让我们知道他们感兴趣的用户。实现此结果的一种可能方法是使用路由参数。路由参数是URL的命名段,由斜杠(/)分隔。每个段捕获URL的与其位置匹配的部分的值。捕获的值可以在req.params对象中找到。 -
route_path: '/user/:userId/book/:bookId'
actual_request_URL: '/user/546/book/6754'
req.params: {userId: '546', bookId: '6754'}
0构建一个安装在路径GET /:word/echo的回显服务器。使用结构{echo: word}响应JSON对象。您可以在req.params.word找到要重复的req.params.word 。您可以从浏览器的地址栏测试您的路线,访问一些匹配的路线,例如您的-app-rootpath / freecodecamp / echo +
构建API时,我们必须允许用户与我们沟通他们希望从我们的服务中获得什么。例如,如果客户端请求有关存储在数据库中的用户的信息,他们需要一种方法让我们知道他们感兴趣的用户。实现此结果的一种可能方法是使用路由参数。路由参数是URL的命名段,由斜杠(/)分隔。每个段捕获URL的与其位置匹配的部分的值。捕获的值可以在req.params对象中找到。 +
route_path: '/user/:userId/book/:bookId'
actual_request_URL: '/user/546/book/6754'
req.params: {userId: '546', bookId: '6754'}
## Instructions
- +构建一个安装在路径GET /:word/echo的回显服务器。使用结构{echo: word}响应JSON对象。您可以在req.params.word找到要重复的req.params.word 。您可以从浏览器的地址栏测试您的路线,访问一些匹配的路线,例如 your-app-rootpath/freecodecamp/echo
## Tests diff --git a/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/implement-a-root-level-request-logger-middleware.chinese.md b/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/implement-a-root-level-request-logger-middleware.chinese.md index bde76c6bb8..0c5539b9a8 100644 --- a/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/implement-a-root-level-request-logger-middleware.chinese.md +++ b/curriculum/challenges/chinese/05-apis-and-microservices/basic-node-and-express/implement-a-root-level-request-logger-middleware.chinese.md @@ -6,13 +6,13 @@ challengeType: 2 --- ## Description -
0在我们介绍express.static()中间件函数之前。现在是时候更详细地看看中间件是什么了。中间件函数是带有3个参数的函数:请求对象,响应对象和应用程序请求 - 响应周期中的下一个函数。这些函数执行一些可能对应用程序产生副作用的代码,并且通常会向请求或响应对象添加信息。当满足某些条件时,它们还可以结束发送响应的循环。如果他们没有发送响应,当他们完成时,他们开始执行堆栈中的下一个函数。触发调用第三个参数next()快递文档中的更多信息。 0查看以下示例: -
function(req, res, next) {
console.log("I'm a middleware...");
next();
}
0假设我们在路线上安装了此功能。当请求与路由匹配时,它会显示字符串“我是中间件......”。然后它执行堆栈中的下一个函数。 0在本练习中,我们将构建一个根级中间件。正如我们在挑战4中所见,要在根级别安装中间件功能,我们可以使用方法app.use(<mware-function>) 。在这种情况下,将对所有请求执行该功能,但您也可以设置更具体的条件。例如,如果您希望仅为POST请求执行某个函数,则可以使用app.post(<mware-function>) 。所有http动词都有类似的方法(GET,DELETE,PUT,...)。 0构建一个简单的记录器。对于每个请求,它应该在控制台中登录一个字符串,采用以下格式: method path - ip 。示例如下: GET /json - ::ffff:127.0.0.1 。请注意, methodpath之间有一个空格,并且破折号分隔pathip被两侧的空格包围。您可以使用req.methodreq.pathreq.ip从请求对象获取请求方法(http谓词),相对路由路径和调用者的ip。记得在完成后调用next() ,否则你的服务器将永远停留。确保打开“日志”,并查看某些请求到达时会发生什么... 0提示:Express按照它们在代码中出现的顺序评估函数。中间件也是如此。如果您希望它适用于所有路由,则应在它们之前安装它。 +
在我们介绍express.static()中间件函数之前。现在是时候更详细地看看中间件是什么了。中间件函数是带有3个参数的函数:请求对象,响应对象和应用程序请求 - 响应周期中的下一个函数。这些函数执行一些可能对应用程序产生副作用的代码,并且通常会向请求或响应对象添加信息。当满足某些条件时,它们还可以结束发送响应的循环。如果他们没有发送响应,当他们完成时,他们开始执行堆栈中的下一个函数。触发调用第三个参数next()快递文档中的更多信息。 查看以下示例: +
function(req, res, next) {
console.log("I'm a middleware...");
next();
}
假设我们在路线上安装了此功能。当请求与路由匹配时,它会显示字符串“我是中间件......”。然后它执行堆栈中的下一个函数。 在本练习中,我们将构建一个根级中间件。正如我们在挑战4中所见,要在根级别安装中间件功能,我们可以使用方法app.use(<mware-function>) 。在这种情况下,将对所有请求执行该功能,但您也可以设置更具体的条件。例如,如果您希望仅为POST请求执行某个函数,则可以使用app.post(<mware-function>) 。所有http动词都有类似的方法(GET,DELETE,PUT,...)。
## Instructions
- +构建一个简单的记录器。对于每个请求,它应该在控制台中登录一个字符串,采用以下格式: method path - ip 。示例如下: GET /json - ::ffff:127.0.0.1 。请注意, methodpath之间有一个空格,并且破折号分隔pathip被两侧的空格包围。您可以使用req.methodreq.pathreq.ip从请求对象获取请求方法(http谓词),相对路由路径和调用者的ip。记得在完成后调用next() ,否则你的服务器将永远停留。确保打开“日志”,并查看某些请求到达时会发生什么... 提示:Express按照它们在代码中出现的顺序评估函数。中间件也是如此。如果您希望它适用于所有路由,则应在它们之前安装它。
## Tests