Модуль не имеет экспортированного члена, «Запрос» - PullRequest
1 голос
/ 18 октября 2019

Я вижу, что есть тонна постов на эту тему, но я не видел ни одного, связанного с Express и моей конкретной проблемой, а именно:

import * as express from 'express';
import { Request, Response, Application } from 'express';  // <-- Error here

выдает мне ошибку (Module has no imported memberдля 'Request', 'Response' и 'Application').

я вижу, что в node_modules есть файлы request.js, response.js и application.js, перечисленные в подпункте /libНа основании трассировки ошибок, я предполагаю, что Express не проверяет в подкаталоге * 1015. * Как я могу принудить / направить систему для проверки в подкаталоге /lib при использовании import? (Или это не проблема, и вообще есть еще одна проблема?).

Я пробовал import { Request, Response, Application } from 'express/lib', import * as expressLib from 'express/lib, а затем import {Request, Response, Application } from expressLib, но ни один из них не работал.

=============================================

Примечание: у меня есть следующий кодниже imports ... Поскольку типы объектов Request и Response являются типами объектов, я предполагаю, что они должны оставаться в верхнем регистре?

import * as express from 'express';
// import * as expressLib from 'express/lib'
import { Request, Response, Application } from 'express';
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
import * as jwt from 'jsonwebtoken';
import * as fs from "fs";

const app: Application = express();

app.use(bodyParser.json());

app.route('api/login')
    .post(loginRoute);

const RSA_PRIVATE_KEY = fs.readFileSync('/demos/private.key');


export function loginRoute(req: Request, res: Response) {

    const email = req.body.email, 
        password = req.body.password;

        if (validateEmailAndPassword()) {
            const userId = findUserIdForEmail(email);

            const jwtBearerToken = jwt.sign({}, RSA_PRIVATE_KEY, {
                algorithm: 'RS256',
                expiresIn: 120,
                subject: userId
            });
            // res.cookie("SESSIONID", jwtBearerToken, {httpOnly: true, secure: true});

            res.status(300).json({
                idToken: jwtBearerToken,
                expiresIn: ""
            })
        } else {
            res.sendStatus(401);
        }
}

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Вы хотите в нижнем регистре «Запрос», «Ответ» и «Приложение».

Когда я запускаю этот код:

console.log('a',express.application);
console.log('A',express.Application);

console.log('req',express.request);
console.log('Req',express.Request);

console.log('res',express.response);
console.log('Res',express.Response);

Я получаю undefined для 'A ',' Req 'и' Res '.

(я бы сделал этот комментарий, но не могу оставлять комментарии.)

1 голос
/ 18 октября 2019

Обновлено: я не осознавал, что вы используете машинопись, пожалуйста, не обращайте внимания на исходный ответ.

С машинописью импорт с заглавной буквы должен работать, если вы установили @ types / express - потому чтоэтот пакет экспортирует заглавные типы: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/express/index.d.ts#L86

Возможно, до перезапуска пакет типов не был каким-либо образом проиндексирован. Это единственное предположение, которое у меня есть, учитывая, что проблема была решена.

=============================================

При импорте модуля - файл, указанный как main , является package.json. Если в package.json нет файла main, то загружается index.js из корневого каталога модуля.

В случае экспресса нет файла main и index.js загружает ./lib/express: https://github.com/expressjs/express/blob/master/index.js

module.exports = require('./lib/express');

Проверяя ./lib/express, мы видим, что он экспортирует request, response и application в нижнем регистре: https://github.com/expressjs/express/blob/master/lib/express.js#L59:

/**
 * Expose the prototypes.
 */

exports.application = proto;
exports.request = req;
exports.response = res;

Таким образом, чтобы импортировать их, вы должны использовать строчные буквы:

import { response, request, application } from 'express'; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...