node.js - 在 Angular Universal 应用程序中从 Express JS 获取值

标签 node.js angular express angular2-universal

我正在构建 Angular2 通用应用程序并正在集成 ng2-translate .

服务器端我需要知道用户的语言,我可以从ExpressJS 得到。通过 request.acceptsLanguages() ( see docs )。

我确实在 server.ts 中正确获取了这些值,如下所示:

function ngApp(req: any, res: any) {
  let supportedLangs = req.acceptsLanguages();
  console.log('supportedLangs', supportedLangs);
  res.render('index', {
    req,
    res,
    ngModule: AppModule,
    preboot: false,
    baseUrl: '/',
    requestUrl: req.originalUrl,
    originUrl: req.hostname
  });
}

然后我不知道如何在我的 app.node.module.ts 中传递或访问它们,我在其中设置了 ng2-translate服务器。

有没有办法从 Angular Universal 应用程序(服务器端)访问这些值?怎么办?

最佳答案

对于那些感兴趣的人,解决方案是使用 Zone,这样做时需要注意一些事项。

首先,要确保 TypeScript 解析器不会中断,您还需要在使用 Zone 的文件顶部声明:

declare var Zone: any;

或者我猜你可能会安装所有类型,但我还没有测试过。

然后,在 Node 中的任何地方只有模块你可以通过执行以下操作获取传递给 server.ts 文件中的 res.render 的参数:

let req = Zone.current.get('req');

最后,您可以在 server.ts 中访问传递给 req 的任何属性,例如:

req.headers['user-agent'];

Angular 5 更新

正如评论中所指出的,之前的代码不再有效。好消息是 Angular 5 更容易和直接:

import { Injector } from '@angular/core';
import { REQUEST } from '@nguniversal/express-engine/tokens';

constructor(
    private _injector: Injector
) {
    const req = this._injector.get(REQUEST);
    // use as: req.headers['whatever-is-in-the-headers']
}

关于node.js - 在 Angular Universal 应用程序中从 Express JS 获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41395893/

相关文章:

angularjs - Mean.io 框架与 socket.io

node.js - 如何将 NodeJS 服务器写入现有域?

node.js - eslint 不从 npm 脚本中的参数中获取文件名

node.js - 使用相对路径在jsx中导入css文件

css - Angular:ngClass 属性中的条件始终被视为 true

css - 如何去掉按钮点击时的框阴影?

javascript - NodeJS : Save menu order

session - 使用 MongoDB 将 session 保存为 BSON,而不是 Node.js 上的字符串

javascript - 如何将组件注入(inject)到Angular2中的div选择器中

express - less 中的 @import 目录语句