Nestjs。 TypeError:根路径必须是字符串

时间:2019-01-23 02:48:21

标签: typescript express nestjs

我正在main.ts中配置静态文件文件夹

  app.useStaticAssets({
    root: path.resolve(__dirname + '/public'),
  });

现在在运行时出现错误TypeError: root path must be a string 我尝试使用path.join(__dirname + '/public'),-没有帮助。

我确实导入了import * as path from 'path'之类的路径

有什么办法解决吗?

更新: 按照我正在尝试的答案:

app.useStaticAssets(join(__dirname, '..', 'public'));-遇到错误{"statusCode":404,"error":"Not Found","message":"Cannot GET /"}

也尝试过:

app.useStaticAssets({
    root: path.join(__dirname, '..', 'public'),
    prefix: '/public/',
  });

此错误仍然存​​在-TypeError: root path must be a string

我的控制器方法如下:

  @Get()
  root(@Res() res) {
    res.sendFile('index.html');
  }

更新: 如果我有app.useStaticAssets(path.join(__dirname, '..', 'public'));并删除仍然有root错误的404控制器方法。

3 个答案:

答案 0 :(得分:1)

您需要提供prefix属性。

修复

  app.useStaticAssets({
    root: path.join(__dirname, '..', 'public'),
    prefix: '/public/',
  });

更多

答案 1 :(得分:1)

请注意,Express和Fastify的配置不同:

Express(默认)

app.useStaticAssets(join(__dirname, '..', 'public'));

强化

app.useStaticAssets({      
    root: join(__dirname, '..', public'),
    prefix: '/public/',
});

在示例中直接导入

join

import { join } from 'path';

如果您要提供静态内容,则无需添加特定的控制器;资产将通过中间件自动提供。

让我们假设您在/public下有两个文件:index.htmlimage.png

  • localhost:3000localhost:3000/index.html服务index.html
  • localhost:3000/image.png服务image.png

请参见此简单的codesandbox example,无需控制器。

答案 2 :(得分:0)

对于任何人来说都是值得的;我花了一段时间,然后才意识到我的await app.listen(3000);早于我的app.useStaticAssets(join(__dirname, '..', 'public'));