0

我的应用程序上的代码是这样的。

import { HttpExceptionFilter } from './common/exceptions/http-exception.filter';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';
import { DocumentBuilder, OpenAPIObject, SwaggerModule } from '@nestjs/swagger';
//1.
import * as expressBasicAuth from 'express-basic-auth';
//2. 
//import expressBasicAuth from 'express-basic-auth'; => promise unhandled error

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.useGlobalPipes(new ValidationPipe()); 
  app.useGlobalFilters(new HttpExceptionFilter());

  app.use(
    ['/docs', '/docs-json'],
    expressBasicAuth({
      challenge: true,
      users: {
        [process.env.SWAGGER_USER]: process.env.SWAGGER_PASSWORD,
      },
    }),
  );
};

我想知道1和2的区别。

因为当我使用 2(9 行)运行我的应用程序时,出现了未处理的错误。

我想知道这两种方式是如何工作的。参考了mozilla的官方文档,但是看不懂。如果你能回答我,我将不胜感激。

4

3 回答 3

2

首先让我们了解导入是如何工作的

所以考虑我有一个包含以下导出的文件

// file name -> modules
export const add = (x, y) => x + y;
export const subtract = (x, y) => x - y;
export default (x, y) => x * y;

现在我可以像这样在另一个文件中导入所有这些功能

import defaultFunction, { add, subtract } from './modules.js';

console.log(add(1, 2)) // 3
console.log(subtract(2, 1)) // 1
console.log(defaultFunction(2, 2)) // 2 * 2 = 4

或者我可以import * as <name> from <file/package>用来导入文件中的所有导出。

像这样


import * as myModules from './modules.js';
// NOTE: this will only give you add and subtract functions but not the default one
// now to actually access the default function you have to use
// import * as <name> from <file/package>
// <name>.default to access the default export
// or simply
// import default, { } from <file/package>


console.log(myModules.add(1, 2)) // 3
console.log(myModules.subtract(2, 1)) // 1
console.log(myModules.default(2, 2)) // 2 * 2 = 4

// or i can destructure the "myModules" import

const { add, subtract } = myModules;

结论

我认为问题在于您使用的库没有提供实际使用的默认导出,import expressBasicAuth from 'express-basic-auth';或者它可能正在导出不同的named exports函数default exports

于 2021-10-17T09:08:41.957 回答
1

大多数时候,模块会导出多个东西 当模块导出具有属性的对象时,有两种从另一个模块导入的好方法。这是常见的情况。

导入整个模块,给它一个名字:

import * as child_process from "child_process";

// then later...
child_process.spawn(...);
or pick the names you want to import:

import { spawn } from "child_process";

// then later
spawn(...);

有时模块只导出一件事。typescript 有 export default 的概念如果一个模块声明了一个默认的 export,那么你必须像这样引入它:

import thing from "thing";

现在你在事物中有一个函数或一个类(无论它的默认导出是什么)。

在 JavaScript (CommonJS?) 模块中更常见的是,模块作者将覆盖module.exports函数或类,而不是像 ES 模块那样向导出对象添加属性。

所以我们有共同的js

const expressBasicAuth = require(express-basic-auth);

在打字稿中:

import * as expressBasicAuth from 'express-basic-auth';
于 2021-10-17T09:08:18.583 回答
1

根据您的代码:

  1. import * as expressBasicAuth from ...

    export const variable1...; export const variable2...;将所有项目作为单个项目导入。

  2. import expressBasicAuth from ...

    export default如果在库中定义了一项,则导入一项。

根据库的实现,以这两种方式导出的函数可能完全不同。

于 2021-10-17T08:57:51.587 回答