简体   繁体   中英

TypeScript Error for expressJS: No overload matches this call

Note: I converted my expressjs code to be an ES6 module. The compiler hasn't complained yet and I'm surprised. I assume we can do this without having to use an.mjs file extension or put type module in a package.json inside my server folder?

I'm using

Node 14.4.0
typescript: 3.9.7

Anyway back to my problem. Not sure how you have to type expressJS stuff, for example I get No overload matches this call here:

在此处输入图像描述

I mean if it's saying there is no such callback why are people using code this way? I'm pretty sure this was valid code for app.listen to check errors like this in the past

server / server.ts

import cluster from 'cluster';

import os from 'os';

import App from './api.js';

const port = process.env.PORT || 3000;

if (cluster.isMaster) {
    for (let i = 0; i < os.cpus().length; i++) {
        cluster.fork();
    }
    console.log('Ready on port %d', port);
} else {
    App.listen(port, (err) => {
        console.log(`express is listening on port ${port}`);
        if (err) {
            console.log('server startup error');
            console.log(err);
        }
    });
}

server / api.ts

import historyApi from 'connect-history-api-fallback';
import compression from 'compression';
import countryTable from './data/countries.json';
import express from 'express';
import companyTable from './data/companies.json';
import _ from 'lodash';

const App = express()
.use(compression())
.on('error', (err: any) => {
    console.log(err);
})
.get('/api/v1/countries', (_req: any, res: any) => {
    res.json(countryTable.map((country: any) => _.pick(country, ['id', 'name', 'images'])));
})
.get('/api/v1/companies', (_req: any, res: any) => {
    res.json(
        companyTable.map((company: any) =>
            _.pick(company, [
                'id',
                'active',
                'images',
                'locations',
            ])
        )
    );
})
.use(historyApi())
.use(express.static('dist'))
.use((_req: any, res: any) => {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Methods', 'GET,OPTIONS');
    res.header(
        'Access-Control-Allow-Headers',
        'Origin,X-Requested-With,Content-Type,Accept,content-type,application/json'
    );
    res.send('Sorry, Page Not Found');
});

export default App;

server / tsconfig.json

{
    "extends": "../../tsconfig",
    "compilerOptions": {
        "outDir": "../../dist/server",                        /* Redirect output structure to the directory. */
        "rootDir": "."                         /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
    },
    "include": ["./*.ts"],
    "resolveJsonModule": true
}

./ tsconfig.json

{
  "compilerOptions": {
    /* Visit https://aka.ms/tsconfig.json to read more about this file */
    "target": "ES2015",                     /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
    "module": "es2020",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
    "lib": ["es5", "es6", "dom"],                      /* Specify library files to be included in the compilation. */
    "moduleResolution": "node",
    "allowJs": true,                     /* Allow javascript files to be compiled. */
//      "checkJs": true,                     /* Report errors in .js files. */
    "jsx": "react",
    "noImplicitAny": true,
    "sourceMap": false,                   /* Generates corresponding '.map' file. */
    "rootDir": "./",                     /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
    "removeComments": true,              /* Do not emit comments to output. */
    "strict": true,                      /* Enable all strict type-checking options. */
    "noUnusedLocals": true,                /* Report errors on unused locals. */
    "noUnusedParameters": true,            /* Report errors on unused parameters. */
//    "rootDirs": ["."],                        /* List of root folders whose combined content represents the structure of the project at runtime. */
    "typeRoots": [
      "node_modules/@types"
    ],                      /* List of folders to include type definitions from. */
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
    "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */
    "resolveJsonModule": true,
    "skipLibCheck": true,                     /* Skip type checking of declaration files. */
    "forceConsistentCasingInFileNames": true
    },
    "include": [
        "src"
    ],
    "exclude": [
        "/node_modules",
        "/src/server",
        "/src/client/js/ink-config.js",
        "**/test",
        "dist"
  ]
}

The error is telling you that the listen() callback does not take any parameters. The correct code should be:

App.listen(port, () => {
    console.log(`express is listening on port ${port}`);
});

Basically delete the error parameter (err) and anything related to it because it does not exist.

The error is instead caught by the on('error') method. But you have already defined it so you should be OK.

You can't quite print out just "server startup error" because the on('error') method catches all errors, not just server startup. But you can catch and display specific errors:

// in api.ts:

.on('error', (err: any) => {
    if (e.code === 'EADDRINUSE') {
        console.log('server startup error: address already in use');
    }
    else {
        console.log(err);
    }
})

This is correct and is not a bug in the express types for typescript. Express merely calls node's http.Server.listen() which in turn calls net.Server.listen() whose callback really does not pass in an error parameter.

For a list of system errors such EADDRINUSE as see: https://nodejs.org/api/errors.html#errors_common_system_errors

For a list of node.js specific errros see: https://nodejs.org/api/errors.html#errors_node_js_error_codes

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM