摘要
手柄教程使用的变量没有显式绑定。我是个车把新手,所以我猜会有一些隐含的绑定在进行。我需要修改代码,但是我不知道这个绑定是如何工作的,甚至不知道搜索什么。
我正在构建一个nodejs应用程序来与microsoft图形API交互。从技术上讲,我正在使用一些Microsoft教程代码作为起点。本教程使用快车和车把构建。
本教程正在运行,一切正常。
现在,我正在修改代码,而且我还无法了解如何为user变量绑定工具栏变量。user变量显示在视图index.hbs和layout.hbs中,例如:
{{#if user}}
<h4>Welcome {{ user.displayName }}!</h4>
<p>Use the navigation bar at the top of the page to get started.</p>
{{else}}
<a href="/auth/signin" class="btn btn-primary btn-large">Click here to sign in</a>
{{/if}}我对手柄很陌生,甚至在阅读了一些教程之后,我仍然不明白这种绑定是如何发生的。我在app.js函数signIncomplete()中找到了下面一行,
const user = await graph.getUserDetails(accessToken);其中getUserDetails()函数创建如下所示的user对象:
const user = await client.api('/me').get();函数signInComplete()访问user.mail和user.userPrincipalName,但是没有显式代码在函数之外公开这个变量。然而,当呈现出工具栏模板时,变量就会被绑定。我检查了调试器中的user变量,因此我知道视图中的数据必须来自signInComplete()。我所读过的几个工具栏引用显示了如何将一个对象绑定到一个已编译的模板,但这里并不是这样。
这个绑定是如何完成的?正如我所提到的,我是一个车把新手,所以如果这是一个特殊的情况或能力,我不知道它是什么,或如何搜索它。因此,链接到文件将不胜感激。
发布于 2020-09-28 22:57:36
绑定发生在您链接到的教程源代码中的app.js第162行上。守则是:
app.use(function(req, res, next) {
// Set the authenticated user in the
// template locals
if (req.user) {
res.locals.user = req.user.profile;
}
next();
});为了了解这里正在发生的事情,我们必须包括几件事。
首先,护照JS用于身份验证。护照JS是一个用于Node应用程序的身份验证中间件。基本上,Passport根据请求对象中的一些数据对用户进行身份验证。如果可以对请求进行身份验证,Passport将在请求(req)对象上将经过身份验证的用户数据添加为请求(req)属性,以供后续处理程序使用。
在上面的代码中,我们可以看到Passport添加的req.user值正在被访问并分配给一个res.locals.user。res.locals是快递应用程序中的一个对象,它允许将每个请求的数据附加到响应(res)对象。
hbs是本教程中使用的快车视图引擎。正是hbs中间件将值res.locals绑定起来,以便使它们可以被工具栏模板访问。
https://stackoverflow.com/questions/64071030
复制相似问题