【问题标题】:Cannot read config.json correctly (TypeScript, Webpack)无法正确读取 config.json(TypeScript、Webpack)
【发布时间】:2016-12-24 06:28:39
【问题描述】:

更新:问题已由this PR修复


请注意,问题出现并且普通纯 JavaScript 方法无法解决的原因可能是因为 server.ts 正在使用 TypeScript网页包。检查甘特的答案。并在 github 上跟踪 this issue

我使用angular/universal-starter 作为启动器。我有一个文件 config.json

{
  "api": "123"
}

当我在 server.ts 中阅读 config 时:

import * as config from '../config.json';
// const config = require('../config.json');  will be same result
console.log(config);

它在终端中显示:

{
  "api": "123"
}

但是,当我尝试在 server.ts 中读取 config.api 时:

import * as config from '../config.json';
// const config = require('../config.json');  will be same result
console.log(config.api);

它显示undefined

这是我的文件夹结构(其他部分相同,如angular/universal-starter)。

my-app
  - config.json
  + src
    - server.ts

当我启动应用程序时,我使用npm start

什么可能导致这种情况?谢谢

【问题讨论】:

  • import config from './config.json';。如果它在节点中,你可以只需要它。 const config = require('./config.json').
  • @SwarajGiri 然后console.log(config);console.log(config.api); 将显示undefined
  • 我在该存储库中看不到任何名为 config.json 的文件。
  • @SeeDart 我用它作为启动器,config.json 是我自己的文件。
  • 您使用的是相对路径还是绝对路径?你能分享一下你的文件结构是什么样的吗?

标签: node.js angular typescript webpack angular2-universal


【解决方案1】:

更新:问题已由this PR修复


请注意,问题出现并且普通纯 JavaScript 方法无法解决的原因可能是因为 server.ts 正在使用 TypeScript网页包。检查甘特的答案。并在 github 上跟踪 this issue

我发现了问题:

import * as config from '../config.json';
// const config = require('../config.json'); also works


const json = JSON.parse(config);  // <- need this line
console.log(json.api);  // 123

【讨论】:

  • 我考虑过这一点,但在 JS 中不应该是这样。也许这是打字稿的事情。请将 Typescript 标签添加到您的问题中。并使标题更具描述性,例如“无法在 TypeScript 中解析 JSON 文件”以避免更多的反对意见。
  • @amingilani 哦,你明白了,我想这就是为什么会出现这个问题!
  • @amingilani 看到我的回复,样板文件使用 webpack 编译服务器和 typescript 的模块加载器自动内联 JSON,所以你得到 ES6 行为。节点 require 从未实际使用过。
  • @HongboMiao 要求工作,但需要使用字符串索引。你可以看看我的回答。
【解决方案2】:

方法一是错误的,因为它与问题配置不匹配。有问题的 webpack 配置对 json 文件使用 raw-loader,而这个答案是使用 json-loader。

使用方法2

这两种方法都用 nodejs + webpack 测试过。

方法一

var config = require(__dirname + '/config.json');
console.log(config['api']);

方法二

var config = JSON.parse(fs.readFileSync(__dirname + '/config.json', 'utf8'));
console.log(config.api);

【讨论】:

  • 第一个不起作用,因为样板文件使用 loader-raw 处理 JSON 文件。
  • @Gant 你是对的,我没有克隆到 repo,而是使用我自己的使用 json-loader 的 webpack 配置。我的错。
【解决方案3】:

您的配置文件由 webpack 内联,因此它遵循 ES6 模块规范并将 JSON 作为字符串返回,而不是您期望从 Node 获得的对象。

您首先使用 webpack 构建服务器有什么原因吗?

【讨论】:

  • 嗯,没有具体原因,只是因为官方的angular/universal-starter用的,所以我直接用它来快速启动
  • 谢谢!我也知道console.log(config); 实际上返回的是字符串而不是 json!这就是为什么我尝试了JSON.parse 然后它起作用了
  • @HongboMiao 这真是一件很奇怪的事情。它打破了您可以对在节点下运行做出的一些假设,并为不需要捆绑(仅编译)的东西增加了编译时间。稍后我会看看能否解决问题。
  • 这很重要!也许您可以帮助在github.com/angular/universal-starter 上创建问题,以避免人们将来遇到问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 2012-04-11
  • 2019-05-22
  • 2019-11-13
  • 2012-02-20
  • 1970-01-01
相关资源
最近更新 更多