Yad*_*adu 10 node.js typescript
我有一个打字稿项目,当我await xxx.someAsyncMethod(..)在顶层使用时,打字稿短绒显示,
Top-level 'await' expressions are only allowed when the 'module' option is set to 'esnext' or 'system', and the 'target' option is set to 'es2017' or higher.
Run Code Online (Sandbox Code Playgroud)
所以我将模块更改为 esnext "module": "esnext"
我会继续尝试运行该程序 npx ts-node app/app.ts
然后控制台通知我
(node:15509) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
Cannot use import statement outside a module
Run Code Online (Sandbox Code Playgroud)
"type": "module"当我运行控制台输出的程序时,在 package.json 中将类型设置为模块
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /Users/apple/Desktop/source_given_to_me/Git/bots/wab/app/app.ts
at Loader.defaultGetFormat [as _getFormat] (internal/modules/esm/get_format.js:65:15)
at Loader.getFormat (internal/modules/esm/loader.js:113:42)
at Loader.getModuleJob (internal/modules/esm/loader.js:244:31)
at Loader.import (internal/modules/esm/loader.js:178:17)
Run Code Online (Sandbox Code Playgroud)
我可以做些什么来逃避使用顶级异步等待?
编辑: 我的 redis.ts 文件
import * as pm from "child_process"
var prc:pm.ChildProcess;
async function startRedis(path:string): Promise<boolean> {
return new Promise((resolve) => {
console.log('starting redis')
var rp = pm.spawn(path)
rp.stdout.on("data", (data) => {
console.log(data)
console.log('redis fired up')
prc= rp
resolve(true)
})
rp.stderr.on("data", (data) => {
console.log(data)
console.log('redis failed to start')
resolve(false)
})
})
}
function active():boolean{
return prc?!prc.killed:false
}
async function stopRedis(): Promise<boolean> {
return new Promise(
(resolve)=>{
if(prc){
resolve(prc.kill("SIGTERM"))
} else {
resolve(false)
}
}
)
}
export const redis = {
startRedis,
stopRedis,
active
}
Run Code Online (Sandbox Code Playgroud)
我的 config.ts 文件(tsconfig.json 在下面)
export const config = {
redisPath:'../r607/src/redis-server'
}
Run Code Online (Sandbox Code Playgroud)
我的 app.ts 文件
import {config} from "./config.js"
import {redis} from "./redis.js"
//import * as pm from "child_process"
await redis.startRedis(config.redisPath)
if(!redis.active()){
process.abort()
}
Run Code Online (Sandbox Code Playgroud)
我的 tsconfig.json
{
"compilerOptions": {
/* Visit https://aka.ms/tsconfig.json to read more about this file */
/* Basic Options */
// "incremental": true, /* Enable incremental compilation */
"target": "esnext", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
"module": "ESNext", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
// "lib": [], /* Specify library files to be included in the compilation. */
// "allowJs": true, /* Allow javascript files to be compiled. */
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
"outDir": "./build", /* Redirect output structure to the directory. */
// "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
// "composite": true, /* Enable project compilation */
// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
// "removeComments": true, /* Do not emit comments to output. */
// "noEmit": true, /* Do not emit outputs. */
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
/* Strict Type-Checking Options */
"strict": true, /* Enable all strict type-checking options. */
// "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
// "strictNullChecks": true, /* Enable strict null checks. */
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
/* Additional Checks */
// "noUnusedLocals": true, /* Report errors on unused locals. */
// "noUnusedParameters": true, /* Report errors on unused parameters. */
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
/* Module Resolution Options */
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
// "typeRoots": [], /* List of folders to include type definitions from. */
// "types": [], /* Type declaration files to be included in compilation. */
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
"esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
/* Source Map Options */
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
/* Experimental Options */
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
/* Advanced Options */
"skipLibCheck": true, /* Skip type checking of declaration files. */
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
}
}
Run Code Online (Sandbox Code Playgroud)
Nat*_*iel 14
按着这些次序:
\n"type": "module"到您的 package.json。"main": "index.js"为"exports": "./index.js"package.json 中的。"engines"为 Node.js 12: "node": "^12.20.0 || ^14.13.1 || >=16.0.0"。"module": "ES2020"到您的 tsconfig.json。import x from \'.\';\xe2\x86\x92 import x from \'./index.js\';。namespace用法并export改为使用。node:协议进行导入。.js即使您正在导入文件,也必须在相对导入中使用扩展名.ts。如果您使用 ts-node\n,请像以下那样使用它:
\nnode --loader ts-node/esm ./entrypoint.ts\nRun Code Online (Sandbox Code Playgroud)\n编辑:\n来源要点
\n您可以使用此模式获得相同的结果:
async function main(): Promise<void> {
const foo = await somePromise
console.log(foo)
}
main()
Run Code Online (Sandbox Code Playgroud)
即使您没有await执行 main,NodeJS 也不会退出,直到事件队列为空。换句话说,当有未解决的承诺时它不会退出。
| 归档时间: |
|
| 查看次数: |
4570 次 |
| 最近记录: |