作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
注意:我将我的 expressjs 代码转换为 ES6 模块。编译器还没有提示,我很惊讶。我假设我们可以做到这一点,而不必使用 .mjs 文件扩展名或将类型模块放在我的服务器文件夹内的 package.json 中?
我在用着
Node 14.4.0
typescript: 3.9.7
无论如何回到我的问题。不知道你必须如何输入 expressJS 的东西,例如我得到
No overload matches this call
这里:
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);
}
});
}
服务器/
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;
服务器/
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"
]
}
最佳答案
错误告诉你 listen()
回调不带任何参数。正确的代码应该是:
App.listen(port, () => {
console.log(`express is listening on port ${port}`);
});
基本上
删除错误参数 (err) 和与之相关的任何内容因为它不存在。
on('error')
捕获。方法。但是你已经定义了它,所以你应该没问题。
on('error')
方法捕获所有错误,而不仅仅是服务器启动。但是您可以捕获并显示特定错误:
// in api.ts:
.on('error', (err: any) => {
if (e.code === 'EADDRINUSE') {
console.log('server startup error: address already in use');
}
else {
console.log(err);
}
})
这是正确的,并且不是 typescript 的 express 类型中的错误。 Express 仅调用 Node 的
http.Server.listen()
进而调用
net.Server.listen()
其回调确实没有传入错误参数。
EADDRINUSE
见:
https://nodejs.org/api/errors.html#errors_common_system_errors
关于javascript - expressJS : No overload matches this call 的 TypeScript 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63312076/
我是一名优秀的程序员,十分优秀!